|
Par
cysboy
Mise à jour : 12/02/2010
96 702 visites depuis 7 jours,
dont 591 sur ce chapitre
classé 4/786
|
).
En voici un : 
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 | import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; public class Fenetre extends JFrame { public Fenetre(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(300, 120); //Les données du tableau Object[][] data = { {"Cysboy", "28 ans", "1.80 cm"}, {"BZHHydde", "28 ans", "1.80 cm"}, {"IamBow", "24 ans", "1.90 cm"}, {"FunMan", "32 ans", "1.85 cm"} }; //Les titres des colonnes String title[] = {"Pseudo", "Age", "Taille"}; JTable tableau = new JTable(data, title); //On ajoute notre tableau à notre contentPane dans un scroll //Sinon les titres des colonnes ne s'afficheront pas ! ! this.getContentPane().add(new JScrollPane(tableau)); } public static void main(String[] args){ Fenetre fen = new Fenetre(); fen.setVisible(true); } } |


1 2 3 4 | //On indique que l'entête doit être au nord, donc au-dessus this.getContentPane().add(tableau.getTableHeader(), BorderLayout.NORTH); //Et le corps au centre ! this.getContentPane().add(tableau, BorderLayout.CENTER); |


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 | import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.TableColumn; public class Fenetre extends JFrame { private JTable tableau; private JButton change = new JButton("Changer la taille"); private JButton retablir = new JButton("Rétablir"); public Fenetre(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(300, 240); Object[][] data = { {"Cysboy", "28 ans", "1.80 cm"}, {"BZHHydde", "28 ans", "1.80 cm"}, {"IamBow", "24 ans", "1.90 cm"}, {"FunMan", "32 ans", "1.85 cm"} }; String title[] = {"Pseudo", "Age", "Taille"}; this.tableau = new JTable(data, title); JPanel pan = new JPanel(); change.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { changeSize(200, 80); change.setEnabled(false); retablir.setEnabled(true); } }); retablir.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { changeSize(75, 16); change.setEnabled(true); retablir.setEnabled(false); } }); retablir.setEnabled(false); pan.add(change); pan.add(retablir); //On remplace cette ligne this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER); this.getContentPane().add(pan, BorderLayout.SOUTH); } /** * Change la taille d'une ligne et d'une colonne * J'ai mis deux boucles afin que vous puissiez voir comment parcourir les colonnes et les lignes * @param width * @param height */ public void changeSize(int width, int height){ //On crée un objet TableColumn afin de travailler sur notre colonne TableColumn col; for(int i = 0; i < tableau.getColumnCount(); i++){ if(i == 1){ //On récupère le modèle de la colonne col = tableau.getColumnModel().getColumn(i); //On lui affecte la nouvelle valeur col.setPreferredWidth(width); } } for(int i = 0; i < tableau.getRowCount(); i++){ //On affecte la taille de la ligne à l'indice spécifié ! if(i == 1) tableau.setRowHeight(i, height); } } public static void main(String[] args){ Fenetre fen = new Fenetre(); fen.setVisible(true); } } |


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 | import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.TableColumn; public class Fenetre extends JFrame { private JTable tableau; private JButton change = new JButton("Changer la taille"); public Fenetre(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(600, 140); Object[][] data = { {"Cysboy", new JButton("6boy"), new Double(1.80), new Boolean(true)}, {"BZHHydde", new JButton("BZH"), new Double(1.78), new Boolean(false)}, {"IamBow", new JButton("BoW"), new Double(1.90), new Boolean(false)}, {"FunMan", new JButton("Year"), new Double(1.85), new Boolean(true)} }; String title[] = {"Pseudo", "Age", "Taille", "OK ?"}; this.tableau = new JTable(data, title); this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER); } public static void main(String[] args){ Fenetre fen = new Fenetre(); fen.setVisible(true); } } |

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 | import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; public class Fenetre extends JFrame { private JTable tableau; private JButton change = new JButton("Changer la taille"); public Fenetre(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(600, 140); Object[][] data = { {"Cysboy", new JButton("6boy"), new Double(1.80), new Boolean(true)}, {"BZHHydde", new JButton("BZH"), new Double(1.78), new Boolean(false)}, {"IamBow", new JButton("BoW"), new Double(1.90), new Boolean(false)}, {"FunMan", new JButton("Year"), new Double(1.85), new Boolean(true)} }; String title[] = {"Pseudo", "Age", "Taille", "OK ?"}; ZModel model = new ZModel(data, title); System.out.println("Nombre de colonne : " + model.getColumnCount()); System.out.println("Nombre de ligne : " + model.getRowCount()); this.tableau = new JTable(model); this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER); } //CLASSE MODÈLE PERSONNALISÉE class ZModel extends AbstractTableModel{ private Object[][] data; private String[] title; /** * Constructeur * @param data * @param title */ public ZModel(Object[][] data, String[] title){ this.data = data; this.title = title; } /** * Retourne le nombre de colonnes */ public int getColumnCount() { return this.title.length; } /** * Retourne le nombre de lignes */ public int getRowCount() { return this.data.length; } /** * Retourne la valeur à l'emplacement spécifié */ public Object getValueAt(int row, int col) { return this.data[row][col]; } } public static void main(String[] args){ Fenetre fen = new Fenetre(); fen.setVisible(true); } } |

1 2 3 4 5 6 | /** * Retourne le titre de la colonne à l'indice spécifé */ public String getColumnName(int col) { return this.title[col]; } |






1 2 3 4 5 6 7 8 9 10 | /** * Retourne la classe de la donnée de la colonne * @param col */ public Class getColumnClass(int col){ //On retourne le type de la cellule à la colonne demandée //On se moque de la ligne puisque les données sur chaque ligne sont les mêmes //On choisit donc la première ligne return this.data[0][col].getClass(); } |

1 2 3 4 5 6 7 | /** * Retourne vrai si la cellule est éditable : celle-ci sera donc éditable * @return boolean */ public boolean isCellEditable(int row, int col){ return true; } |
1 2 3 4 5 6 7 8 9 10 11 | /** * Retourne vrai si la cellule est éditable : celle-ci sera donc éditable * @return boolean */ public boolean isCellEditable(int row, int col){ //On appelle la méthode getValueAt qui retourne la valeur d'une cellule //Et on fait un traitement spécifique si c'est un JButton if(getValueAt(0, col) instanceof JButton) return false; return true; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import java.awt.Component; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; public class TableComponent extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { //Si la valeur de la cellule est un JButton, on transtype notre valeur if (value instanceof JButton){ return (JButton) value; } else return this; } } |

1 2 3 4 5 | Object[][] data = { {"Cysboy", new JButton("6boy"), new JComboBox(new String[]{"toto", "titi", "tata"}), new Boolean(true)}, {"BZHHydde", new JButton("BZH"), new JComboBox(new String[]{"toto", "titi", "tata"}), new Boolean(false)}, {"IamBow", new JButton("BoW"), new JComboBox(new String[]{"toto", "titi", "tata"}), new Boolean(false)}, {"FunMan", new JButton("Year"), new JComboBox(new String[]{"toto", "titi", "tata"}), new Boolean(true)} }; |


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import java.awt.Component; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; public class TableComponent extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof JButton){ return (JButton) value; } //LIGNE RAJOUTÉE else if(value instanceof JComboBox){ return (JComboBox) value; } else return this; } } |


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 | import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; public class Fenetre extends JFrame { private JTable tableau; private JButton change = new JButton("Changer la taille"); public Fenetre(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(600, 180); Object[][] data = { {"Cysboy", "6boy", "Combo", new Boolean(true)}, {"BZHHydde", "BZH", "Combo", new Boolean(false)}, {"IamBow", "BoW", "Combo", new Boolean(false)}, {"FunMan", "Year", "Combo", new Boolean(true)} }; String title[] = {"Pseudo", "Age", "Taille", "OK ?"}; this.tableau = new JTable(data, title); this.tableau.setRowHeight(30); this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER); } public static void main(String[] args){ Fenetre fen = new Fenetre(); fen.setVisible(true); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import java.awt.Component; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; public class ButtonRenderer extends JButton implements TableCellRenderer{ public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean isFocus, int row, int col) { //On écrit dans le bouton ce que contient la cellule setText((value != null) ? value.toString() : ""); //on retourne notre bouton return this; } } |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import java.awt.Component; import javax.swing.JComboBox; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; public class ComboRenderer extends JComboBox implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean isFocus, int row, int col) { this.addItem("Très bien"); this.addItem("Bien"); this.addItem("Mal"); return this; } } |


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 | import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JTable; public class ButtonEditor extends DefaultCellEditor { protected JButton button; private boolean isPushed; private ButtonListener bListener = new ButtonListener(); /** * Constructeur avec une checkBox * @param checkBox * @param count */ public ButtonEditor(JCheckBox checkBox) { //Par défaut, ce type d'objet travaille avec un JCheckBox super(checkBox); //On crée à nouveau notre bouton button = new JButton(); button.setOpaque(true); //On lui attribue un listener button.addActionListener(bListener); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { //On définit le numéro de ligne à notre listener bListener.setRow(row); //Idem pour le numéro de colonne bListener.setColumn(column); //On passe aussi le tableau pour des actions potentielles bListener.setTable(table); //On réaffecte le libellé au bouton button.setText( (value ==null) ? "" : value.toString() ); //On renvoie le bouton return button; } /** * Notre listener pour le bouton * @author CHerby * */ class ButtonListener implements ActionListener{ private int column, row; private JTable table; private int nbre = 0; public void setColumn(int col){this.column = col;} public void setRow(int row){this.row = row;} public void setTable(JTable table){this.table = table;} public void actionPerformed(ActionEvent event) { //On affiche un Zoli message mais vous pourriez faire les traitements que vous voulez System.out.println("coucou du bouton : " + ((JButton)event.getSource()).getText() ); //On affecte un nouveau libellé à une cellule de la ligne table.setValueAt("New Value " + (++nbre), this.row, (this.column -1)); } } } |



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 | import java.awt.BorderLayout; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; public class Fenetre extends JFrame { private JTable tableau; private JButton change = new JButton("Changer la taille"); //Contenu de notre combo private String[] comboData = {"Très bien", "Bien", "Mal"}; public Fenetre(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(600, 180); //Données de notre tableau Object[][] data = { {"Cysboy", "6boy", comboData[0], new Boolean(true)}, {"BZHHydde", "BZH", comboData[0], new Boolean(false)}, {"IamBow", "BoW", comboData[0], new Boolean(false)}, {"FunMan", "Year", comboData[0], new Boolean(true)} }; //titre du tableau String title[] = {"Pseudo", "Age", "Taille", "OK ?"}; //Combo à utiliser JComboBox combo = new JComboBox(comboData); this.tableau = new JTable(data, title); this.tableau.setRowHeight(30); this.tableau.getColumn("Age").setCellRenderer(new ButtonRenderer()); this.tableau.getColumn("Age").setCellEditor(new ButtonEditor(new JCheckBox())); //On définit l'éditeur par défaut pour la cellule //en lui spécifiant quel type d'affichage prendre en compte this.tableau.getColumn("Taille").setCellEditor(new DefaultCellEditor(combo)); this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER); } public static void main(String[] args){ Fenetre fen = new Fenetre(); fen.setVisible(true); } } |




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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | package com.sdz.jtable2; import java.awt.BorderLayout; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; public class Fenetre extends JFrame { private JTable tableau; private JButton change = new JButton("Changer la taille"); //Contenu de notre combo private String[] comboData = {"Très bien", "Bien", "Mal"}; public Fenetre(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(600, 180); //Données de notre tableau Object[][] data = { {"Cysboy", "6boy", comboData[0], new Boolean(true)}, {"BZHHydde", "BZH", comboData[0], new Boolean(false)}, {"IamBow", "BoW", comboData[0], new Boolean(false)}, {"FunMan", "Year", comboData[0], new Boolean(true)} }; //titre du tableau String title[] = {"Pseudo", "Age", "Taille", "OK ?"}; //Combo à utiliser JComboBox combo = new JComboBox(comboData); //Nous devons utiliser un modèle d'affichage spécifique afin de pallier aux bugs d'affichage ! ZModel zModel = new ZModel(data, title); this.tableau = new JTable(zModel); this.tableau.setRowHeight(30); this.tableau.getColumn("Age").setCellRenderer(new ButtonRenderer()); this.tableau.getColumn("Age").setCellEditor(new ButtonEditor(new JCheckBox())); //On définit l'éditeur par défaut pour la cellule //en lui spécifiant quel type d'affichage prendre en compte this.tableau.getColumn("Taille").setCellEditor(new DefaultCellEditor(combo)); this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER); } class ZModel extends AbstractTableModel{ private Object[][] data; private String[] title; /** * Constructeur * @param data * @param title */ public ZModel(Object[][] data, String[] title){ this.data = data; this.title = title; } /** * Retourne le titre de la colonne à l'indice spécifé */ public String getColumnName(int col) { return this.title[col]; } /** * Retourne le nombre de colonnes */ public int getColumnCount() { return this.title.length; } /** * Retourne le nombre de lignes */ public int getRowCount() { return this.data.length; } /** * Retourne la valeur à l'emplacement spécifié */ public Object getValueAt(int row, int col) { return this.data[row][col]; } /** * Défini la valeur à l'emplacement spécifié */ public void setValueAt(Object value, int row, int col) { //On interdit la modification sur certaine colonne ! if(!this.getColumnName(col).equals("Age") && !this.getColumnName(col).equals("Suppression")) this.data[row][col] = value; } /** * Retourne la classe de la donnée de la colonne * @param col */ public Class getColumnClass(int col){ //On retourne le type de la cellule à la colonne demandée //On se moque de la ligne puisque les données sur chaque ligne sont les mêmes //On choisit donc la première ligne return this.data[0][col].getClass(); } public boolean isCellEditable(int row, int col){ return true; } } public static void main(String[] args){ Fenetre fen = new Fenetre(); fen.setVisible(true); } } |
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 | package com.sdz.jtable2; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; public class ButtonEditor extends DefaultCellEditor { protected JButton button; private boolean isPushed; private ButtonListener bListener = new ButtonListener(); /** * Constructeur avec une checkBox * @param checkBox * @param count */ public ButtonEditor(JCheckBox checkBox) { //Par défaut, ce type d'objet travaille avec un JCheckBox super(checkBox); //On crée à nouveau notre bouton button = new JButton(); button.setOpaque(true); //On lui attribue un listener button.addActionListener(bListener); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { //On définit le numéro de ligne à notre listener bListener.setRow(row); //Idem pour le numéro de colonne bListener.setColumn(column); //On passe aussi le tableau pour des actions potentielles bListener.setTable(table); //On réaffecte le libellé au bouton button.setText( (value ==null) ? "" : value.toString() ); //On renvoie le bouton return button; } /** * Notre listener pour le bouton * @author CHerby * */ class ButtonListener implements ActionListener{ private int column, row; private JTable table; private int nbre = 0; private JButton button; public void setColumn(int col){this.column = col;} public void setRow(int row){this.row = row;} public void setTable(JTable table){this.table = table;} public JButton getButton(){return this.button;} public void actionPerformed(ActionEvent event) { //On affiche un Zoli message mais vous pourriez faire les traitements que vous voulez System.out.println("coucou du bouton : " + ((JButton)event.getSource()).getText() ); //On affecte un nouveau libellé à une celulle de la ligne ((AbstractTableModel)table.getModel()).setValueAt("New Value " + (++nbre), this.row, (this.column -1)); //Permet de dire à notre tableau qu'une valeur a changé //à l'emplacement déterminé par les valeur passée en paramètre ((AbstractTableModel)table.getModel()).fireTableCellUpdated(this.row, this.column - 1); this.button = ((JButton)event.getSource()); } } } |

1 2 | //data et title sont toujours nos tableaux d'objets ! JTable tableau = new JTable(new DefaultTableModel(data, title)); |



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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | package com.sdz.jtable; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; public class Fenetre extends JFrame { private JTable tableau; private JButton change = new JButton("Changer la taille"); private String[] comboData = {"Très bien", "Bien", "Mal"}; private String supp = "Supprimer la ligne"; private JComboBox combo; public Fenetre(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(600, 250); this.createContent(); } private void createContent(){ //Données de notre tableau Object[][] data = { {"Cysboy", "6boy", comboData[0], new Boolean(true), supp}, {"BZHHydde", "BZH", comboData[0], new Boolean(false), supp}, {"IamBow", "BoW", comboData[0], new Boolean(false), supp}, {"FunMan", "Year", comboData[0], new Boolean(true), supp} }; //titre du tableau String title[] = {"Pseudo", "Age", "Taille", "OK ?", "Suppression"}; //Combo à utiliser combo = new JComboBox(comboData); //Nous devons utiliser un modèle d'affichage spécifique afin de pallier aux bugs d'affichage ! ZModel zModel = new ZModel(data, title); this.tableau = new JTable(zModel); this.tableau.setRowHeight(30); this.tableau.getColumn("Age").setCellRenderer(new ButtonRenderer()); this.tableau.getColumn("Age").setCellEditor(new ButtonEditor(new JCheckBox())); //On définit l'éditeur par défaut pour la cellule //en lui spécifiant quel type d'affichage prendre en compte this.tableau.getColumn("Taille").setCellEditor(new DefaultCellEditor(combo)); DefaultTableCellRenderer dcr = new DefaultTableCellRenderer(); this.tableau.getColumn("Taille").setCellRenderer(dcr); //On définit un éditeur pour la colonne "supprimer" this.tableau.getColumn("Suppression").setCellEditor(new DeleteButtonEditor(new JCheckBox())); //On ajoute le tableau this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER); JButton ajouter = new JButton("Ajouter une ligne"); ajouter.addActionListener(new MoreListener()); this.getContentPane().add(ajouter, BorderLayout.SOUTH); } class ZModel extends AbstractTableModel{ private Object[][] data; private String[] title; /** * Constructeur * @param data * @param title */ public ZModel(Object[][] data, String[] title){ this.data = data; this.title = title; } /** * Retourne le titre de la colonne à l'indice spécifé */ public String getColumnName(int col) { return this.title[col]; } /** * Retourne le nombre de colonnes */ public int getColumnCount() { return this.title.length; } /** * Retourne le nombre de lignes */ public int getRowCount() { return this.data.length; } /** * Retourne la valeur à l'emplacement spécifié */ public Object getValueAt(int row, int col) { return this.data[row][col]; } /** * Défini la valeur à l'emplacement spécifié */ public void setValueAt(Object value, int row, int col) { //On interdit la modification sur certaine colonne ! if(!this.getColumnName(col).equals("Age") && !this.getColumnName(col).equals("Suppression")) this.data[row][col] = value; } /** * Retourne la classe de la donnée de la colonne * @param col */ public Class getColumnClass(int col){ //On retourne le type de la cellule à la colonne demandée //On se moque de la ligne puisque les données sur chaque ligne sont les mêmes //On choisit donc la première ligne return this.data[0][col].getClass(); } /** * Méthode permettant de retirer une ligne du tableau * @param position */ public void removeRow(int position){ int indice = 0, indice2 = 0, nbRow = this.getRowCount()-1, nbCol = this.getColumnCount(); Object temp[][] = new Object[nbRow][nbCol]; for(Object[] value : this.data){ if(indice != position){ temp[indice2++] = value; } System.out.println("Indice = " + indice); indice++; } this.data = temp; temp = null; //Cette méthode permet d'avertir le tableau que les données ont été modifiées //Ce qui permet une mise à jours complète du tableau this.fireTableDataChanged(); } /** * Permet d'ajouter une ligne dans le tableau * @param data */ public void addRow(Object[] data){ int indice = 0, nbRow = this.getRowCount(), nbCol = this.getColumnCount(); Object temp[][] = this.data; this.data = new Object[nbRow+1][nbCol]; for(Object[] value : temp) this.data[indice++] = value; this.data[indice] = data; temp = null; //Cette méthode permet d'avertir le tableau que les données ont été modifiées //Ce qui permet une mise à jours complète du tableau this.fireTableDataChanged(); } public boolean isCellEditable(int row, int col){ return true; } } class MoreListener implements ActionListener{ public void actionPerformed(ActionEvent event) { Object[] donnee = new Object[]{"Angelo", "Rennais", comboData[0], new Boolean(false), supp}; ((ZModel)tableau.getModel()).addRow(donnee); } } public static void main(String[] args){ Fenetre fen = new Fenetre(); fen.setVisible(true); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import java.awt.Component; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; public class ButtonRenderer extends JButton implements TableCellRenderer{ public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean isFocus, int row, int col) { //On écrit dans le bouton avec la valeur de la cellule setText((value != null) ? value.toString() : ""); //on retourne notre bouton return this; } } |
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 | import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class ButtonEditor extends DefaultCellEditor { protected JButton button; private ButtonListener bListener = new ButtonListener(); /** * Constructeur avec une checkBox * @param checkBox * @param count */ public ButtonEditor(JCheckBox checkBox) { //Par défaut, ce type d'objet travaille avec un JCheckBox super(checkBox); //On crée à nouveau notre bouton button = new JButton(); button.setOpaque(true); //On lui attribue un listener button.addActionListener(bListener); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { //On définit le numéro de lignes à notre listener bListener.setRow(row); //Idem pour le numéro de colonnes bListener.setColumn(column); //On passe aussi le tableau pour des actions potentielles bListener.setTable(table); //On réaffecte le libellé au bouton button.setText( (value ==null) ? "" : value.toString() ); //On renvoie le bouton return button; } /** * Notre listener pour le bouton * @author CHerby * */ class ButtonListener implements ActionListener{ private int column, row; private JTable table; private int nbre = 0; private JButton button; public void setColumn(int col){this.column = col;} public void setRow(int row){this.row = row;} public void setTable(JTable table){this.table = table;} public JButton getButton(){return this.button;} public void actionPerformed(ActionEvent event) { //On affiche un Zoli message mais vous pourriez faire les traitements que vous voulez System.out.println("coucou du bouton : " + ((JButton)event.getSource()).getText() ); //On affecte un nouveau libellé à une celulle de la ligne ((AbstractTableModel)table.getModel()).setValueAt("New Value " + (++nbre), this.row, (this.column -1)); //Permet de dire à notre tableau qu'une valeur a changé //à l'emplacement déterminé par les valeur passée en paramètre ((AbstractTableModel)table.getModel()).fireTableCellUpdated(this.row, this.column - 1); this.button = ((JButton)event.getSource()); } } } |
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 | import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class DeleteButtonEditor extends DefaultCellEditor { protected JButton button; private DeleteButtonListener bListener = new DeleteButtonListener(); /** * Constructeur avec une checkBox * @param checkBox * @param count */ public DeleteButtonEditor(JCheckBox checkBox) { //Par défaut, ce type d'objet travaille avec un JCheckBox super(checkBox); //On crée à nouveau notre bouton button = new JButton(); button.setOpaque(true); //On lui attribue un listener button.addActionListener(bListener); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { //On définit le numéro de lignes à notre listener bListener.setRow(row); //On passe aussi le tableau pour des actions potentielles bListener.setTable(table); //On réaffecte le libellé au bouton button.setText( (value ==null) ? "" : value.toString() ); //On renvoie le bouton return button; } /** * Notre listener pour le bouton * @author CHerby * */ class DeleteButtonListener implements ActionListener{ private int row; private JTable table; public void setRow(int row){this.row = row;} public void setTable(JTable table){this.table = table;} public void actionPerformed(ActionEvent event) { if(table.getRowCount() > 0){ //On affiche un Zoli message mais vous pourriez faire les traitements que vous voulez System.out.println("coucou du bouton : " + ((JButton)event.getSource()).getText() ); //On affecte un nouveau libellé à une celulle de la ligne ((ZModel)table.getModel()).removeRow(this.row); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import java.awt.Component; import javax.swing.JComboBox; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; public class ComboRenderer extends JComboBox implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean isFocus, int row, int col) { this.addItem("Très bien"); this.addItem("Bien"); this.addItem("Mal"); return this; } } |




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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | import java.awt.BorderLayout; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class TableFrame extends JFrame { private JTable tableau; private String supp = "Supprimer la ligne"; public TableFrame(){ this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("JTable"); this.setSize(300, 120); this.createContent(); } private void createContent(){ Object[][] data = { {"Cysboy", "6boy", "Homme"}, {"BZHHydde", "BZH", "Homme"}, {"IamBow", "BoW", "Femme"}, {"FunMan", "Year", "Homme"} }; String title[] = {"Pseudo", "Age", "sexe"}; this.tableau = new JTable(new DefaultTableModel(data, title)); this.tableau.getTableHeader().addMouseListener(new MouseAdapter(){ public void mouseReleased(MouseEvent event){ if(event.getButton() == event.BUTTON3){ //Si on est dans le tableau if(tableau.columnAtPoint(new Point(event.getX(), event.getY())) != -1){ //ajouter une colonne JMenuItem ajouter = new JMenuItem("Ajouter une colonne"); ajouter.addActionListener(new AddListener()); //Le menu effacer JMenuItem erase = new JMenuItem("Effacer cette colonne"); erase.addActionListener(new EraseListener(new Point(event.getX(), event.getY()))); //Ajout du menu contextuel JPopupMenu menu = new JPopupMenu(); menu.add(ajouter); menu.add(erase); menu.show(tableau, event.getX(), event.getY()); } } } }); this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER); } /** * Classe gérant la suppression d'une colonne * @author CHerby */ class EraseListener implements ActionListener{ private Point point = null; private Object[][] data; private Object[] title; public EraseListener(Point col){ this.point = col; } public void actionPerformed(ActionEvent event) { //On récupère l'indice de la colonne int col = tableau.columnAtPoint(this.point); //On en déduit la colonne sur laquelle on se trouve TableColumn column = tableau.getColumn(tableau.getColumnName(col)); //On avertit le modèle que le tableau a perdu une colonne initNewData(column); //On donne les nouvelles données au modèle ((DefaultTableModel)tableau.getModel()).setDataVector(this.data, this.title); } /** * Méthode qui génère un nouveau contenu au modèle * @param column * @return */ private void initNewData(TableColumn column){ this.data = new Object[tableau.getRowCount()][tableau.getColumnCount()-1]; this.title = new Object[tableau.getColumnCount()-1]; //On parcourt toutes les lignes for(int i = 0; i < tableau.getRowCount(); i++){ //Toutes les colonnes for(int j = 0, k = 0; j < tableau.getColumnCount(); j++){ //Si la colonne concernée n'est pas celle à effacer if(!((DefaultTableModel)tableau.getModel()).getColumnName(j).equals(column.getHeaderValue())){ //On récupère les titres de colonnes au premier passage if(i == 0)this.title[k] = ((DefaultTableModel)tableau.getModel()).getColumnName(j); //on récupère les données this.data[i][k] = tableau.getValueAt(i, j); k++; } } } } } /** * Permet d'ajouter une colonne au tableau, enfin, au modèle du tableau * @author CHerby */ class AddListener implements ActionListener{ public void actionPerformed(ActionEvent event) { //On affiche une pop-up JOptionPane jop = new JOptionPane(), jop2 = new JOptionPane(); String nom = jop.showInputDialog(null, "Saisissez le nom de la nouvelle colonne", "Ajout d'une colonne", JOptionPane.QUESTION_MESSAGE); //Si les contrôles d'usage sont bons if(nom != null){ if(!nom.trim().equals("")){ //On ajoute une colonne au modèle ((DefaultTableModel)tableau.getModel()).addColumn(nom); } } } } public static void main(String[] args){ TableFrame fen = new TableFrame(); fen.setVisible(true); } } |


