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 :

Pas d'affichage des lignes dans une JTable


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Pas d'affichage des lignes dans une JTable
    Bonjour
    je me tourne vers vous car je ne parviens pas à afficher des lignes dans une JTable. Je m'explique :

    J'ai un JPanel qui contient une JTable "Table1" et un JButton "ouvrir". Ce bouton permet d'ouvrir une JDialog qui contient également une JTable "Table2" et un bouton "ajouter".

    J'aimerais récupérer les éléments sélectionnés dans cette Table2 et en cliquant sur ajouter qu'ils apparaissent dans la table1.

    Je ne parviens pas à trouver l'erreur dans le code

    Merci d'avance de votre aide

    Voici le code

    Le panneau principal
    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
     
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
     
    public class Pan extends JPanel implements ActionListener {
     
    private final JButton plusButton;
    private final JScrollPane scrollPane;
    private final Dialog propertySelection;
    private final Table1 propertyTable;
     
    public Pan (Dialog propertySelection) {
      super(new GridBagLayout());
      this.propertyTable = new Table1();
      this.plusButton = new JButton("Ouvrir");
      this.scrollPane = new JScrollPane();
      this.propertySelection = propertySelection;
      initializeGUI();
      initializeListener();
    }
     
    private void initializeGUI() {
      scrollPane.setViewportView(propertyTable);
      add(plusButton, new GridBagConstraints(1, 1, 1, 1, 0.0, 1.0, GridBagConstraints.NORTH, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
      add(scrollPane, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
      setVisible(true);
    }
     
    private void initializeListener() {
      plusButton.addActionListener(this);
    }
     
    public void actionPerformed(ActionEvent e) {
      if ((e.getSource() == plusButton)) {
        propertySelection.setVisible(true);
      }
    }
     
    }
    La table 1
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    import java.awt.Component;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeSet;
     
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JTable;
    import javax.swing.SwingConstants;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableRowSorter;
     
     
    public class Table1 extends JTable {
      private static final String[] columnName = { "Col1", "Col2", "Col3" };
      private final TableRowSorter<Model1> sorter;
      private final Model1 model;
      private final List<String> liste = new ArrayList<String>();
     
      public Table1() {
        super();
        model = new Model1();
        setModel(model);
        sorter = new TableRowSorter<Model1>(model);
        setDefaultRenderer(JComponent.class, new TableRenderer());
        setRowSelectionAllowed(true);
        model.fireTableStructureChanged();
      }
     
      public void setNames(final List<String> items) {
        model.setNames(items);
      }
     
     
      public class TableRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
          setHorizontalAlignment(SwingConstants.CENTER);
          final int rowModel = sorter.convertRowIndexToModel(row);
          if (value instanceof JButton) return (JButton) value;
          else return this;
        }
      }
     
      // Implementation du modele de Table1
      class Model1 extends AbstractTableModel {
     
        public void setNames(final List<String> ajout) {
          liste.clear();
            final Set<String> uniquesNames = new TreeSet<String>(ajout);
            liste.addAll(uniquesNames); 
     
          System.out.println("/******Ajout********/");
          Object [] obj = liste.toArray();
          for (Object object : obj)
          System.out.println(object);
          fireTableStructureChanged();
        }
     
        public int getRowCount() {
          return Math.max(0, liste.size());
        }
     
        public int getColumnCount() {
          return columnName.length;
        }
     
        public Object getValueAt(int rowIndex, int columnIndex) {
          if (columnIndex == 0) return new JButton("btn1");
          else if (columnIndex == 2) return new JButton("btn2");
          else return liste.get(rowIndex);
        }
     
        public String getColumnName(int columnIndex) {
          return columnName[columnIndex];
        }
     
        public Class<?> getColumnClass(int column) {
          if ((column == 0)||(column == 2)) return JButton.class;
          else return String.class;
        }
     
        public boolean isCellEditable(int row, int column) {
          return false;
        }
      }
    }
    La JDialog
    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
     
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.List;
     
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JScrollPane;
     
     
    	public class Dialog extends JDialog implements ActionListener{
     
    		  private final JScrollPane scrollPane;
    		  private final JButton buttonAdd;
    		  protected Table2 panelParameters;
    		  private Table1 table1;
     
     
    		  public Dialog(Table1 table1) {
    		    this.table1 = table1;
    		    this.setSize(350, 500);
    		    this.setLocationRelativeTo(null);
    		    this.scrollPane = new JScrollPane();
    		    this.panelParameters = new Table2();
    		    this.buttonAdd = new JButton("Ajouter");
    		    initializeListener();
    		    initializeGUI();
    		    this.setVisible(false);
    		  }
     
    		  private void initializeListener() {
    		    buttonAdd.addActionListener(this);
    		  }
     
    		  private void initializeGUI() {
    		    scrollPane.setViewportView(panelParameters);
    		    this.setLayout(new GridBagLayout());
    		    this.add(scrollPane, new GridBagConstraints(0, 3, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
    		    this.add(buttonAdd, new GridBagConstraints(0, 4, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
    		  }
     
    		  @Override
    		  public void actionPerformed(ActionEvent e) {
    		     if (e.getSource() == buttonAdd) {
    		    	 final List<String> selection = panelParameters.getSelectedNames();
    				    table1.setNames(selection);
    		     }
    		  }
    	}
    La Table2
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    import java.awt.Component;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeSet;
     
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JTable;
    import javax.swing.SwingConstants;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableRowSorter;
     
     
    public class Table2 extends JTable {
     
      private static final String[] columnName = { "Prenoms"};
      private final TableRowSorter<Model2> sorter;
      private final Model2 model;
      private List<String> prenoms;
      String[] tab = {"prenom1", "prenom2", "prenom3"};
     
      public Table2() {
    	this.prenoms= new ArrayList<String>();
    	prenoms.add(tab[0]);
    	prenoms.add(tab[1]); 
    	prenoms.add(tab[2]);
     
    	Object[][] data = {   
    	    	      {prenoms.get(0)},
    	    	      {prenoms.get(1)},
    	    	      {prenoms.get(2)}
    	    	    };
     
        this.model = new Model2(data, columnName);
        sorter = new TableRowSorter<Model2>(model);
        setModel(model);
        setDefaultRenderer(JComponent.class, new TableRenderer());
        setRowSelectionAllowed(true);
        model.fireTableStructureChanged();
      }
     
      public void setAllSelected(final boolean selectAll) {
        final int viewRowCount = model.getRowCount();
        if (viewRowCount <= 0) return;
        if (selectAll) addRowSelectionInterval(0, viewRowCount - 1);
        else removeRowSelectionInterval(0, viewRowCount - 1);
      }
     
      public List<String> getSelectedNames() {
        final List<String> selection = new ArrayList<String>(getSelectedRowCount());
        for (int i : getSelectedRows()) {
          selection.add(prenoms.get(sorter.convertRowIndexToModel(i)));
        }
        return selection;
      }
     
      //Renderer pour definir la façon de dessiner les composants dans les cellules
      public class TableRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
          setHorizontalAlignment(SwingConstants.CENTER);
          final int rowModel = sorter.convertRowIndexToModel(row);
           return this;
        }
      }
     
      class Model2 extends AbstractTableModel {
        Object[][] data;
        String[] columnName;
     
        public Model2(Object[][] data, String[] columnName) {
          this.data = data;
          this.columnName = columnName;
        }
     
        @Override
        public int getColumnCount() {
          return columnName.length;
        }
     
        @Override
        public int getRowCount() {
          if (data == null) return 0;
          return data.length;
        }
     
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
          return data[rowIndex][columnIndex];
        }
     
        @Override
        public String getColumnName(int columnIndex) {
          return columnName[columnIndex];
        }
     
        // On retourne le type de la cellule à la colonne demandée
        @Override
        public Class<?> getColumnClass(int column) {
          return this.data[0][column].getClass();
        }
     
        @Override
        public boolean isCellEditable(int row, int column) {
          return false;
        }
      }
    }
    Le main
    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
     
    import javax.swing.JFrame;
     
    public class Test {
     
    	public static void main(String[] args) {
    		Table1 table1 = new Table1();
    		JFrame frame = new JFrame();
    		Pan panneau = new Pan(new Dialog(table1));
    		frame.setContentPane(panneau);
    		frame.setSize(300, 300);
    	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	    frame.setLocationRelativeTo(null);
    	    frame.setVisible(true);
     
    	}
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ton code est bien compliqué, et c'est probablement pour ça que tu t'y perd : la JTable/Table1 affichée dans la fenêtre (exactement dans Pan) n'est pas celle dans laquelle tu ajoutes des lignes (celle qui se trouve dans Dialog et qui est créé dans ta méthode main() !...).

    Modifie ton constructeur de Pan :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public Pan () { // on ne passe plus le dialog en paramètre
     super(new GridBagLayout());
     this.propertyTable = new Table1();
     propertySelection = new Dialog(propertyTable); // on créé ici le dialogue avec la même JTable que celle que le pan connait
     this.plusButton = new JButton("Ouvrir");
     this.scrollPane = new JScrollPane();
     //this.propertySelection = propertySelection; // évidement il faut supprimer cette ligne
     initializeGUI();
     initializeListener();
    }
    et le programme bien sûr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static void main(String[] args) {
    		//Table1 table1 = new Table1(); // ne pas la créer ici
    		JFrame frame = new JFrame();
    		Pan panneau = new Pan(); // plus de paramètre
    /*...*/
    Après, j'ai beaucoup d'autres remarques, mais je vais me limiter à :

    1. dans setNames() du modèle de table1, tu fais un fireTableStructureChanged() : ceci indique que la structure de la table change (des colonnes en plus ou en moins, les types de données qui changent...

      un fireTableDataChanged(); est normalement suffisant, quand seulement les données changent.

      d'ailleurs le model.fireTableStructureChanged(); dans le constructeur de Table1 est inutile : cet appel n'est utile que si on change la structure après que la JTable ait été affichée
    2. Le renderer de Table2 ne sert à rien : il n'y a pas de données de type JComponent dans la table
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Merci beaucoup pour toutes ces remarques et cette réponse rapide.

    Je vais essayer de simplifier tout ca...

Discussions similaires

  1. [JTable] coloration des lignes d'une JTable
    Par MathiasM dans le forum Composants
    Réponses: 3
    Dernier message: 22/06/2009, 10h19
  2. Affichager des pourcentages dans une JTable
    Par Polux000 dans le forum Composants
    Réponses: 3
    Dernier message: 04/02/2009, 17h42
  3. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50
  4. Ne pas tenir compte des accents dans une requete
    Par zamanika dans le forum Installation
    Réponses: 8
    Dernier message: 08/11/2004, 19h49
  5. [C#] Affichage des lignes dans un tableau.
    Par maldufleur dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/04/2004, 11h28

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