[Java] une JList à la place d'une JComboBox
Résolu
moussecp
Messages postés
58
Date d'inscription
Statut
Membre
Dernière intervention
-
moussecp Messages postés 58 Date d'inscription Statut Membre Dernière intervention -
moussecp Messages postés 58 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis occupé à développer un GUI pour un projet. C'est la première fois que je fais ça donc j'ai un peu du mal. :)
Pour le moment j'utilise une interface "JGridBagFrame" et j'ai une fenêtre avec des boutons et une liste de sélection de la forme "JComboBox". Seulement je suis plus intéressé par une multiple sélection de type "JList". Seulement quand je remplace les éléments de la ComboBox par ceux de la liste, je n'ai pas du tout le résultat souhaité.
Sur les images ci-dessous, j'ai juste remplacé le module de sélection d'une liste (le truc avec écris ALL avec une flèche) par une liste où on peut sélectionner plusieurs éléments. Mais comme vous voyez, la liste est très longue et elle s'étale sur toute la fenêtre. J'aimerais que seulement 10 éléments soient visible avec une scroll bar mais ça n'a pas l'air de marcher.
Merci d'avance.
---
Regardez plutôt :
http://desmond.imageshack.us/Himg812/scaled.php?server=812&filename=screen1jv.jpg&res=medium
http://desmond.imageshack.us/Himg705/scaled.php?server=705&filename=screen2vt.jpg&res=medium
MainRunGUI
GridBagFrame
MultipleSelectionFrame
NetList
Le fichier NetCodeList.txt est un fichier texte de 600 lignes qui se trouve dans le dossier du projet et qui est de la forme suivante :
Une signature ? Pas besoin de signature.
Je suis occupé à développer un GUI pour un projet. C'est la première fois que je fais ça donc j'ai un peu du mal. :)
Pour le moment j'utilise une interface "JGridBagFrame" et j'ai une fenêtre avec des boutons et une liste de sélection de la forme "JComboBox". Seulement je suis plus intéressé par une multiple sélection de type "JList". Seulement quand je remplace les éléments de la ComboBox par ceux de la liste, je n'ai pas du tout le résultat souhaité.
Sur les images ci-dessous, j'ai juste remplacé le module de sélection d'une liste (le truc avec écris ALL avec une flèche) par une liste où on peut sélectionner plusieurs éléments. Mais comme vous voyez, la liste est très longue et elle s'étale sur toute la fenêtre. J'aimerais que seulement 10 éléments soient visible avec une scroll bar mais ça n'a pas l'air de marcher.
Merci d'avance.
---
Regardez plutôt :
http://desmond.imageshack.us/Himg812/scaled.php?server=812&filename=screen1jv.jpg&res=medium
http://desmond.imageshack.us/Himg705/scaled.php?server=705&filename=screen2vt.jpg&res=medium
MainRunGUI
import javax.swing.JFrame; public class MainRunGUI { public static void main(String[] args) { GridBagFrame gridBagFrame = new GridBagFrame(); gridBagFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gridBagFrame.setSize(500,300); // set frame size gridBagFrame.setVisible(true); //display frame; }// end main }// end class GridBagDemo
GridBagFrame
import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Component; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.JComboBox; public class GridBagFrame extends JFrame { private GridBagLayout layout; //layout of this frame private GridBagConstraints constraints; //constraints of this layout //set up GUI public GridBagFrame(){ super ("Scenario Builder for FIDO GUI"); layout = new GridBagLayout(); setLayout(layout); //set frame layout constraints = new GridBagConstraints(); // instantiate constraints // create GUI components JTextArea textAreaNET = new JTextArea ("NETS", 1, 5); JTextArea textAreaRFD = new JTextArea ("RFD", 1, 5); JTextArea textAreaINFO = new JTextArea ("Data to be processed", 1, 20); // create selection lists to copy MultipleSelectionFrame NetListSelection = new MultipleSelectionFrame(); JList netList = NetListSelection.getInputList(); // list to hold all the nets JList copyJList = NetListSelection.getCopiedList(); // list to copy net names into JButton copyJButton = NetListSelection.getCopyButton(); // button to copy selected names // USE OF LIST IN WINDOW /*NetList netList = new NetList(); String list[] = netList.getList(); JComboBox comboBox = new JComboBox(list);*/ JButton buttonRFD1 = new JButton("RFD1"); JButton buttonRFD2 = new JButton("RFD2"); JButton buttonRFD3 = new JButton("RFD3"); JButton buttonRUN = new JButton("RUN"); JTextField textFieldComments = new JTextField ("Comments"); JTextField textFieldInfo = new JTextField ("TextInfo"); constraints.fill = GridBagConstraints.BOTH; constraints.weightx = 10; constraints.weighty = 10; addComponent(textAreaNET, 0, 0, 1, 1); addComponent(textAreaRFD, 0, 1, 1, 1); addComponent(textAreaINFO, 0, 2, 1, 1); addComponent(netList, 1, 0, 1, 1); //addComponent(comboBox, 1, 0, 1, 1); addComponent(copyJButton, 9, 0, 1, 1); addComponent(buttonRFD1, 1, 1, 1, 1); addComponent(buttonRFD2, 2, 1, 1, 1); addComponent(buttonRFD3, 3, 1, 1, 1); addComponent(buttonRUN, 10, 0, 1, 1); addComponent(textFieldComments,10,1,3,3); addComponent(copyJList,1,2,3,1); addComponent(textFieldInfo,1,2,3,1); } //end GridBagFrame constructor // method to set constraints on private void addComponent(Component component, int row, int column, int width, int height){ constraints.gridx = column; // set gridx constraints.gridy = row; // set gridy constraints.gridwidth = width; //set gridwidth constraints.gridheight = height; //set gridheight layout.setConstraints(component, constraints); // set constraints add(component); // add component }//end method addComponent }//end class GridBagFrame
MultipleSelectionFrame
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; public class MultipleSelectionFrame extends JFrame{ private JList netList; // list to hold all the nets private JList copyJList; // list to copy net names into private JButton copyJButton; // button to copy selected names NetList GeneratedList = new NetList(); private final String list[] = GeneratedList.getList(); public MultipleSelectionFrame(){ super("Multiple Selection Lists"); setLayout(new FlowLayout()); netList = new JList(list); netList.setVisibleRowCount(5); netList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); add(new JScrollPane(netList)); copyJButton = new JButton("Select"); copyJButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent event){ copyJList.setListData(netList.getSelectedValues()); } } ); add(copyJButton); copyJList = new JList(); copyJList.setVisibleRowCount(5); copyJList.setFixedCellWidth(100); copyJList.setFixedCellHeight(15); copyJList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); add(new JScrollPane(copyJList)); } public JList getInputList(){ return netList; } public JList getCopiedList(){ return copyJList; } public JButton getCopyButton(){ return copyJButton; } public static void main(String args[]){ MultipleSelectionFrame multipleSelectionFrame = new MultipleSelectionFrame(); multipleSelectionFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); multipleSelectionFrame.setSize(500,300); multipleSelectionFrame.setVisible(true); } }
NetList
import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class NetList { // NET CODE LIST GENERATION private String[] List; public NetList(){ List = new String[595]; // Import from text file File file = new File("NetCodeList.txt"); FileInputStream fis = null; BufferedInputStream bis = null; DataInputStream dis = null; try { fis = new FileInputStream(file); // Here BufferedInputStream is added for fast reading. bis = new BufferedInputStream(fis); dis = new DataInputStream(bis); // dis.available() returns 0 if the file does not have more lines. int i=0; while (dis.available() != 0) { // this statement reads the line from the file and print it to // the string array. List[i]=dis.readLine(); i=i+1; } // dispose all the resources after using them. fis.close(); bis.close(); dis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public String[] getList(){ return List; } }
Le fichier NetCodeList.txt est un fichier texte de 600 lignes qui se trouve dans le dossier du projet et qui est de la forme suivante :
ALL 02ALS0 02AND0 02ASS0 02BER0 02BOS0 02BRA0 02BRC0 02CEN0 02DIL0 02DRO0 02ENG0 02EUR0 02EVE0 02FOR0 02GEN0 02GIL0 02GRI0 02HAL0 02HER0 02HOE0 02IXE0 02JET0 02KOR0 02LAS0 02LEN0 02LIN0 02MAR0 02MEL0 02MOL0
Une signature ? Pas besoin de signature.
A voir également:
- [Java] une JList à la place d'une JComboBox
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
2 réponses
J'avoue que je me perds un peu dans ton code :(
En particulier pourquoi tu as besoin de créer autant de classes, tu n'as pas à en recréer une à chaque fois que tu veux un comportement particulier !
Lorsque tu fais ta classe NetList, tu utilises un String[595] et cela pose un certain nombre de bugs vu que cela rempli tout de cases vides !
Je te conseille d'utiliser des List<String> comme ceci :
Remarque : cette classe est un exemple parfait de ce que j'expliquais tout à l'heure, elle ne sert à rien ! Ses objets n'en sont pas vraiment, elle se comporte comme n'importe quelle méthode statique, alors autant la remplacer par ceci :
Tu gagnerais en productivité (et en esthétique) si tu utilisais des éditeurs comme NetBeans pour créer ton application graphique plutôt que de tout taper à la main...
La confiance n'exclut pas le contrôle
En particulier pourquoi tu as besoin de créer autant de classes, tu n'as pas à en recréer une à chaque fois que tu veux un comportement particulier !
Lorsque tu fais ta classe NetList, tu utilises un String[595] et cela pose un certain nombre de bugs vu que cela rempli tout de cases vides !
Je te conseille d'utiliser des List<String> comme ceci :
import java.util.LinkedList; import java.util.Scanner; public class NetList extends LinkedList<String> { private static final long serialVersionUID = 1L; public NetList() { try { Scanner sc = new Scanner(new File("NetCodeList.txt")); while (sc.hasNextLine()) add(sc.nextLine()); sc.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } public String[] getList() { return toArray(new String[size()]); } }
Remarque : cette classe est un exemple parfait de ce que j'expliquais tout à l'heure, elle ne sert à rien ! Ses objets n'en sont pas vraiment, elle se comporte comme n'importe quelle méthode statique, alors autant la remplacer par ceci :
private static File ressource = new File("D:\\NetCodeList.txt") private static String[] NetList() { LinkedList<String> liste = new LinkedList<String>(); try { Scanner sc = new Scanner(ressource); while (sc.hasNextLine()) liste.add(sc.nextLine()); sc.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } return liste.toArray(new String[liste.size()]); }
Tu gagnerais en productivité (et en esthétique) si tu utilisais des éditeurs comme NetBeans pour créer ton application graphique plutôt que de tout taper à la main...
La confiance n'exclut pas le contrôle
D'où vient ta classe MultipleSelectionFrame ? Elle n'est pas standard et il y en a beaucoup de versions différentes sur internet. Celles que j'ai trouvé n'ont pas les méthodes getInputList, getCopiedList et getCopyButton dont tu te sers...
Il serait sûrement mieux de toujours utiliser des méthodes standards plutôt que de prendre un bout de code par ci, par là...
Il serait sûrement mieux de toujours utiliser des méthodes standards plutôt que de prendre un bout de code par ci, par là...
En fait je me suis grandement inspiré d'un livre de Java et j'ai trouvé que la structure qui me convenait le mieux parmi celles proposées était la GridBagFrame.
Indépendamment de ça, ils expliquent comment utiliser un JFrame d'où leur classe "MultipleSelectionFrame".
Je me suis contenté d'implémenter les deux ensemble. Mais si tu penses que je ferais mieux d'utiliser des fonctions existantes, je suis toute ouïe. :)
Indépendamment de ça, ils expliquent comment utiliser un JFrame d'où leur classe "MultipleSelectionFrame".
Je me suis contenté d'implémenter les deux ensemble. Mais si tu penses que je ferais mieux d'utiliser des fonctions existantes, je suis toute ouïe. :)
Pour ce qui est de la liste en effet là il manque des éléments. C'est juste que je n'ai pas recopié les 595 lignes du fichier mais seulement les 20-30 premières.
Enfin pour ce qui est du nombre de classes, disons que je n'ai pas une grande expérience de l'orienté objet et la personne pour qui je fais le code (je suis en stage dans une entreprise) m'a conseillé de plutôt faire trop de classes que pas assez.
Quoi qu'il en soit, un grand merci d'avoir passé du temps sur mon problème. J'essaierais une autre approche via NetBeans, comme tu proposes, demain. :)
Pour les listes, il vaut mieux utiliser mon code quand même, car si tu as 595 éléments aujourd'hui tu en auras peut-être 596 demain, et ton code va planter car ton tableau ne sera pas assez grand !
NetBeans est un IDE comme Eclipse, mais il propose en plus de créer des "Java Desktop Application", il te suffit de faire glisser les composants pour les mettre où tu veux.
Bon, en pratique c'est pas forcément aussi simple que ça et il y a pas mal de choses que tu devras faire tout seul quand même mais pour l'aspect graphique, c'est bien plus rapide (surtout si tu ne connais pas bien swing... comme moi ^^)