[Java] une JList à la place d'une JComboBox

Résolu/Fermé
moussecp Messages postés 58 Date d'inscription lundi 30 juillet 2007 Statut Membre Dernière intervention 10 mai 2012 - Modifié par moussecp le 7/08/2011 à 21:27
moussecp Messages postés 58 Date d'inscription lundi 30 juillet 2007 Statut Membre Dernière intervention 10 mai 2012 - 9 août 2011 à 17:35
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
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:

2 réponses

KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
Modifié par KX le 7/08/2011 à 22:39
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 :

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
1
moussecp Messages postés 58 Date d'inscription lundi 30 juillet 2007 Statut Membre Dernière intervention 10 mai 2012
7 août 2011 à 22:48
NetBeans ? Je ne connais pas, je vais aller regarder ça. :)

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. :)
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
7 août 2011 à 23:00
Faire des classes d'accord, mais pas n'importe comment, ici elles ne servent à rien du tout !

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 ^^)
0
moussecp Messages postés 58 Date d'inscription lundi 30 juillet 2007 Statut Membre Dernière intervention 10 mai 2012
9 août 2011 à 17:35
En guise de conclusion, j'ai en effet utilisé NetBeans, ce qui m'a grandement facilité la tâche. J'ai réussis à faire tout ce que je voulais et bien plus via cet IDE.
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
7 août 2011 à 21:11
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à...
0
moussecp Messages postés 58 Date d'inscription lundi 30 juillet 2007 Statut Membre Dernière intervention 10 mai 2012
7 août 2011 à 21:13
c'est moi qui l'ai crée. Je l'ai ajouté dans mon premier message. Elle n'a rien de très compliqué. :)
0
moussecp Messages postés 58 Date d'inscription lundi 30 juillet 2007 Statut Membre Dernière intervention 10 mai 2012
7 août 2011 à 21:17
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. :)
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
7 août 2011 à 21:21
J'avais du commencer à travailler avec le code avant que tu ne le modifies c'est pour ça que je n'ai pas vu la classe MultipleSelectionFrame, cependant il me manque encore la classe NetList pour pouvoir tester...
0
moussecp Messages postés 58 Date d'inscription lundi 30 juillet 2007 Statut Membre Dernière intervention 10 mai 2012
7 août 2011 à 21:22
ok je rajoute. 2 secondes.
et encore merci.
0