IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

JList et JchekBox dynamiques


Sujet :

Composants Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut JList et JchekBox dynamiques
    Bien l'bonjour!

    Je suis face à un problème de taille : je développe une appli permettant d'administrer des serveurs (jvous passe les détails lol)

    Dans mon cas précis, j'ai une fenêtre (JInternalFrame) qui s'ouvre suite à une sélection de x serveurs... je souhaite, pour chaque serveur sélectionné précédemment (donc nombre variable), mettre 3 JCheckBox en face de chaque nom...

    Etant donné que je peux avoir aussi bien 10 serveurs que 50, dans le cas de 50 tout ne vas pas rentrer dans ma fenêtre. J'ai donc réfléchis (sisi jvous assure) et j'ai trouvé 2 solutions réalisables :
    - partir sur la base de 5 noms de serveus par fenêtre, et mettre en place des boutons suivant et précédent pour passer aux 5 serveurs suivants ou précédents,
    - utiliser des JList et JScrollPane, donc avoir une barre de défilement sur la droite. Seulement cela ne me régle pas le problème des CheckBox : il doit y avoir 3 checkbox en face de chaque nom de serveur...

    Pour ceux qui ont ptêtre pas compris mon explication todue, voici un schéma :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Nom serveur      Data      Redirect      Supervis
      serv1            x
      serv2                       x
      serv3            x
       ...
    Voilà donc on partant sur la deuxième solution, jme demandais si c'était possible de tout mettre dans la JList, cad pouvoir faire défiler les noms et les check box

    Si quelqu'un m'a compris merci de m'aider

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Dans ton cas je m'orienterais plutôt vers une JTable qui est faite pour ça plutôt qu'une JList

    Avec un DefaultTableModel un peu redéfini pour faire apparaître directement les checkboxes au lieu des valeurs des booléens que tu manipule et le tour est joué

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    ha oui bien vu!

    par contre puis je me permettre de te demander du code car j'ai jamais utilisé cela...

    pour info, je travaille avec un Vecteur contenant les noms des serveurs, par défaut le checkbox coché est data

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    hein juanito
    tu veux du code de JTable c'est ca??

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Pour la JTable je ne vais pas franchement te faire de dessin, la JTable a un constructeur prenant un paramètre un TableModel.
    Pour récupérer les évènements utilisateur tu vas utiliser un TableModelListener sur le model de ta JTable.

    Donc dans l'ordre tu crées une classe Héritant de DefaultTableModel, et tu redéfinis la méthode getColumnClass pour renvoyer Boolean.class pour que ta JTable affiche des JCheckBox à la place de la valeur de ton Boolean(c'est pas franchement propre mais bon, vu que tu ne veux mettre que des checkboxes dans ta table, on va pas trop chipoter non plus), et les méthodes dont tu vas avoir besoin, mais pour l'instant je n'en vois aucune à redéfinir, elles font déja tout ce que tu demande.
    Pense également à redéfinir les contructeurs de ton model en fontion des constructeurs du DefaultTableModel
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class MyModel extends DefaultTableModel {
     
       public MyModel(Object[][] data, Objetc[] columnNames) {
           super(data, columnNames);
       }
    }
    Normalement il y en a plus mais j'ai la flemme de la faire

    Puis tu crées ton modèle, puis ta JTable (crées une classe étendant JTable et implémentant TabkleModelListener, il te faudra avec le modèle créé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MyTable Extends JTable implements TableModelListener {
       ....
     
       //redéfinis la méthode valueChanged
       protected void valueChanged(<a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/event/TableModelEvent.html" target="_blank">TableModelEvent</a> e){
        doSomething()
      }
    }
    Tu ajoute un TableModelListener sur ton model

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myModel.addTableModelListener(myTable);
    Et puis tu as un peu de matière, bon code

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    ok merci jvais essayer avec ça

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    Bon je suis bloqué là...

    Voici cque j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    // =====  definition of the DataFileTableModel class  ====================
    public class DataFileTableModel extends AbstractTableModel
    {
     protected Vector data;            // data
     protected Vector serverNames ;    // server names
     protected Vector columnNames;   // names of the column
     protected Vector temp;     // recuperation vecteur passé en param
     public DataFileTableModel(Vector serverAllocated)
     {
               initVectors(serverAllocated);
     }
     public void initVectors(Vector vect)
     {
      columnNames = new Vector();
      serverNames = new Vector();
      for(int i = 0; i < vect.size(); i++)
      {
       serverNames.addElement(vect.get(i).toString());
      }
      columnNames.addElement("Server name");
      columnNames.addElement("Data");
      columnNames.addElement("Redirector");
      columnNames.addElement("Supervisor");
      // mettre dans vecteur data donnée relatives aux check box
     }
     /** Nombre de colonnes */
     public int getColumnCount()
     {
      int NbColumn = 4
      return NbColumn;
     }
     /** Nombre de lignes */
     public int getRowCount()
     {
      return serverNames.size();
     }
     /** Noms des colonnes */
     public String getColumnName(int columnIndex)
     {
      String colName="";
      if (columnIndex <= getColumnCount())
       colName=(String)columnNames.elementAt(columnIndex);
      return colName;
     }
     /** Type de contenu d'une colonne */
     public Class getColumnClass(int columnIndex)
     {
      if (columnIndex == 1)
          return String.class;
         if ((columnIndex >1) && (columnIndex <=4))
          return Boolean.class;
     }
     /** Possibilité d'édition des données */
     public boolean isCellEditable(int rowIndex, int columnIndex)
     {
      if (columnIndex == 1)
       return false;
      if ((columnIndex >1) && (columnIndex <=4))
       return true;
     }
     /** Contenu d'une cellule */
     public Object getValueAt(int rowIndex, int columnIndex)
     {
      if (columnIndex == 1)
       return (String)serverNames.elementAt(rowIndex);
      if ((columnIndex >1) && (columnIndex <=4))
      {
       ????????????????
      }
     }
     /** Changement du contenu d'une cellule */
     public void setValueAt(Object aValue, int rowIndex, int columnIndex)
     {
     }
    }
    Pour ce qui est l'ajout de texte (par exemple nom des servers) ya pas de problème, mais dès qu'il s'agit de gérer les chek box je comprends plus rien...

    Help meeeeeeeeeeeeeee

  8. #8
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Pour l'instant dans ton constructeur tu ne passe que les informations concernant le nom des serveurs sans passer les infos sur leur état, mais ta JTable a besoin que celles ci soient renseignées (enfin même à null ça passe)

    Pour tes noms de serveur un truc sympa serait de la mettre dans une table non editable à part que tu mettrais dans le rowHeader de ton JScrollPane:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monScrollPane.setRowHeader(new JViewPort(maTableDesNoms));
    Celà permet d'avoir les deux tables qui scrollent en même temps et une séparation logique donnée/présentation au niveau du code

    Ensuite pour la table avec les checkboxes: en fait ton vector data contiendra les valeurs booléennes correspondant à l'état de tes checkboxes. En fait ce sera un Vector de Vector de Boolean.

    Ensuite pour la méthode getValueAt(intx, int y):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Object getValueAt(int x, int y) {
       return data.get(x).get(y);
    }
    Fera l'affaire

    Pour le setValueAt qui te permet de changer les valeurs dans ta table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void setValueAt(Object value, int x, int y) {
       data.get(x).set(y,value);
       fireTableCellUpdated(x,y); //permet de prévenir la table que le model à changé
    }

    Bon ensuite je ne te mets pas les verifs au niveau des index mais à toi de te débrouiller
    ++

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    rohhh làlà bas j'ai du boulot !!

    merki

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    hello hello!

    Bon voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    import javax.swing.*;
    import javax.swing.JMenuItem.*;
    import javax.swing.event.*;
    import javax.swing.border.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.sql.*;
    import java.util.*;
    import java.text.*;
    import java.io.*;
    import java.lang.*;
    import javax.swing.table.*;
     
    // =====  definition of the XrdIServerTypeTableModel class  ====================
    public class XrdIServerTypeTableModel extends AbstractTableModel
    {
     protected Object[][] data = {
         {"ccbbsn10", new Boolean(true), new Boolean(false), new Boolean(false)},
         {"ccbbsn13", new Boolean(true), new Boolean(false), new Boolean(false)},
         {"ccbbsn14", new Boolean(true), new Boolean(false), new Boolean(false)},
         {"ccbbsn15", new Boolean(true), new Boolean(false), new Boolean(false)},
         {"ccbbsn16", new Boolean(true), new Boolean(false), new Boolean(false)}
     };
     protected String[] columnNames = {"Server name", "Data", "Redirector", "Supervisor"};   // names of the column
     //Object[][] data = new Object[serverAllocated.size()][4];
     public XrdIServerTypeTableModel(Vector serverAllocated)
     {
     
     }
     /** Nombre de colonnes */
      public int getColumnCount()
      {
       return columnNames.length;
      }
     
     /** Nombre de lignes */
     public int getRowCount()
     {
      return data.length;
     }
     /** Noms des colonnes */
     public String getColumnName(int col)
     {
      return columnNames[col];
     }
     
     /** Type de contenu d'une colonne */
     public Class getColumnClass(int c)
     {
      return getValueAt(0, c).getClass();
     }
     
     /** Possibilité d'édition des données */
     public boolean isCellEditable(int row, int col)
     {
      if((row > 1) && (col < 1))
      {
       return true;
      }
      else
      {
       return false;
      }
     }
     
     /** Contenu d'une cellule */
     public Object getValueAt(int row, int col)
     {
      return data[row][col];
     }
     
     /** Changement du contenu d'une cellule */
     public void setValueAt(Object value, int row, int col)
     {
      data[row][col] = value;
      fireTableCellUpdated(row, col);
     }
     
    }
     
    // ================================ End of the XrdIServerTypeTableModel class  =========================================
    et dans la classe (interf graphique) où le tableau doit apparaitre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JTable table = new JTable(new XrdIServerTypeTableModel(tabServerAllocated));
       JScrollPane scrollPane = new JScrollPane(table);
       table.setPreferredScrollableViewportSize(new Dimension(500, 70));
       table.setVisible(true);
       jp.add(table);
    tout se compile, l'interface s'ouvre, mais le tableau n'apparait pas dans le JPanel (jp)...

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    Essaye de rajouter une table d'aggregate


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     JTable table = new JTable(new XrdIServerTypeTableModel(tabServerAllocated));
     JScrollPane scrollPane = new JScrollPane(table);  
      table.setPreferredScrollableViewportSize(new Dimension(500, 70));
     table.setVisible(true);    
    tableAggregate = scrollpane;
    jp.add(tableAggregate);
     jp.add(table);

    Si ca marche pas je l'ai fais je t'envoie mon code que tu puisse mieux comparer

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    jvais essayer mais jvois pas cke ça va changer à part ajouter une ligne de code

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    Ben ouai mais moi ca marche et sans la table ca marche pas ...

  14. #14
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    Ca c'est mon tableau qui affiche le nom de plusieurs composants et leur numero de serie dans un tableau.
    Je recupere les données dans le tableau lValeurs
    Voila si ta des questions....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
     
                    JPanel ps = VideoMain.createHorizontalPanel(false);
     
                    final String[] names = { "Nom", "Serie" };
     
                    // Create the dummy data (a few rows of names)
                    String data[][] = new String[lValeurs.countLignes(1)][2];
     
                    for (int i = 0; i < lValeurs.countLignes(1); i++)
                    {
                        data[i][0] = (lValeurs.getElementTableau(1, i, 0));
                        data[i][1] = (lValeurs.getElementTableau(1, i, 1));
                    }
     
                    // Create a model of the data.
                    TableModel dataModel = new TableMap(names, data);
                    // Create the table
                    tableView = new JTable(dataModel);
                    // Turn off auto-resizing so that we can set column sizes programmatically
                    // In this mode, all columns will get their preferred widths, as set blow. 
                    tableView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                    // Set the width of the "Nom" column.
                    TableColumn nameColumn = tableView.getColumn("Nom");
                    nameColumn.setPreferredWidth(200);
                    // Set the width of the "serie" column.
                    TableColumn valueColumn = tableView.getColumn("Serie");
                    valueColumn.setPreferredWidth(150);
     
                    scrollpane = new JScrollPane(tableView);
                    scrollpane.setPreferredSize(new Dimension(360, 150));
                    tableAggregate = scrollpane;
                    ps.add(Box.createRigidArea(new Dimension(5, 1)));
                    ps.add(tableAggregate);                
                    panel.add(scrollpane);
                    panel.add(ps);
    Normalement ca devrait marcher

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    et puis comment il faut déclarer tableAggregate ?? C'est kel type?

  16. #16
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    oups j'avais oublié , désolé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
        JScrollPane tableAggregate;

  17. #17
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    désolé je t'ai dis des conneries Juanito mais bon aparement tu as trouvé c'est parfait

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    bon j'ai réglé le problème de l'affichage, mais maintenant je n'arrive pas à faire en sorte que l'on puisse changer la "valeur" des check boxes.

    voici la fonction que j'ai ajouté dans la classe XrdIServerTypeTableModel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void tableChanged(TableModelEvent e)
     {
      int row = e.getFirstRow();
      int column = e.getColumn();
      XrdIServerTypeTableModel model = (XrdIServerTypeTableModel)e.getSource();
      String columnName = model.getColumnName(column);
      Object data = model.getValueAt(row, column);
      // Do something with the data...
     }

  19. #19
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    c'est a dire ? changer la valeur cocher ou décocher? ou le libellé?

Discussions similaires

  1. Gérer le ré-affichage d'une JList dynamique
    Par zorglubpok dans le forum Composants
    Réponses: 11
    Dernier message: 04/11/2009, 15h22
  2. [JList] Modification dynamique
    Par qwiskas dans le forum Composants
    Réponses: 4
    Dernier message: 23/02/2009, 12h45
  3. Probleme JList / JList Model / Evolution dynamique
    Par SebastianPx dans le forum Composants
    Réponses: 1
    Dernier message: 10/02/2009, 13h14
  4. [JScrollPane] n'affiche pas toute ma JList dynamique
    Par Strab dans le forum Composants
    Réponses: 4
    Dernier message: 01/07/2008, 17h57
  5. Mise a jour dynamique d'une Jlist ou d'un panel
    Par skyangel dans le forum Composants
    Réponses: 5
    Dernier message: 14/06/2008, 08h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo