Bonjour ,
je cherche à effectuer une action différente selon la ligne (ou la case) cliqué sur mon Jtable. Pour l'instant je ne peux que'effectuer une action pour un clic sur l'ensemble du tableau.
Merci 8-)
Version imprimable
Bonjour ,
je cherche à effectuer une action différente selon la ligne (ou la case) cliqué sur mon Jtable. Pour l'instant je ne peux que'effectuer une action pour un clic sur l'ensemble du tableau.
Merci 8-)
Utilise l'interface ListSelectionListener :
Seul soucis, quand on fait un clic sur une ligne, la méthode valueChanged est appelée 2 fois, une fois à l'enfoncement du bouton de la souris et une fois à son relâchement... quelqu'un sait pourquoi ? Sinon le changement de ligne avec les flèches du clavier marche très bien.Code:
1
2
3
4
5
6
7
8
9
10
11 JTable t = new JTable() ; t.getSelectionModel().addListSelectionListener( new MonListener() ) ; public class MonListener implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { int ligneSelectionne = t.getSelectedRow() ; System.out.println("Ligne sélectionnée : " + ligneSelectionne ); } }
En espérant que ça t'aidera ;)
Mille merci , je reviendrai te dire ce qu'il en ai.
il me renvoi -1 sur la première ligne , rofl :(
et vrai l'action se fait 2 fois , quelqu'un à une idée ?
Voilà mon code
Code:
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226 package Carte; import java.awt.GridLayout; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.TableCellRenderer; import Utilitaires.DataBase; public class Serveurs extends JPanel implements Runnable{ private static final long serialVersionUID = 1L; String NomServeur; Vector <String> LettreDisque; Vector <Double> tailleMax; Vector <Boolean> unite; int pourcentage; int x = 0; int y = 20; JScrollPane pan; JTable tabler; DataBase base; ResultSet resultat; CompTableCellRenderer composant = new CompTableCellRenderer(); Thread tache; JPanel serv = this; boolean test = true; double taille; public void run(){ while(test){ try{ this.lancer(); this.updateUI(); Thread.sleep(60000); } catch(Exception ecx){ System.out.println("Erreur de sleep de SErveur"+ecx.fillInStackTrace());} } } public void stopper(){ test = false; } public void lancer(){ try{ String req="select id from appareils where nom = '"+NomServeur+"'"; System.out.println(req); base = new DataBase(req); base.readBDD(); resultat = base.retourner(); if(resultat.next() && resultat.next()){ String id = resultat.getString("id"); String[] nom = {"Disque","Espace Libre","Espace Libre","Etat"}; LettreDisque = new Vector<String>(); tailleMax = new Vector<Double>(); unite = new Vector<Boolean>(); String req1="select lettre_disque,taille from el_disques where superviser = 1 and nom = '"+NomServeur+"' order by lettre_disque"; System.out.println(req1); base.request=req1; base.readBDD(); resultat = base.retourner(); while(resultat.next()){ LettreDisque.addElement(resultat.getString("lettre_disque")); tailleMax.addElement(resultat.getDouble("taille")); } base.fermer(); Object[][] data = new Object[LettreDisque.size()][nom.length]; JTable table = new JTable(new Modele(data,nom)); table.setRowHeight(25); table.setShowGrid(false); new ModeleListener(table); pan = new JScrollPane(table); for(int i = 0;i < LettreDisque.size();i++){ String req2="select probleme,id from erreurs where nom = '"+NomServeur+"' and probleme = '"+LettreDisque.get(i)+"' and critique = 1 and id = '"+id+"'"; System.out.println(req2); base = new DataBase(req2); base.readBDD(); resultat = base.retourner(); if(resultat.next()){ table.setValueAt(new ImageIcon("images/iconefalse.GIF"),i,3); } else{ table.setValueAt(new ImageIcon("images/iconeOK.GIF"),i,3); } base.fermer(); taille = Double.parseDouble(tailleMax.get(i).toString()); JProgressBar bar = new JProgressBar(0,(int)taille); System.out.println("taille barre"+taille); String baf="select disques.utiliser from appareils,disques where appareils.id = disques.id and appareils.id = (select max(id) from appareils where nom = '"+NomServeur+"') and description = '"+LettreDisque.get(i).toString()+"' and disques.nom = '"+NomServeur+"' and appareils.id > '"+id+"' order by description"; System.out.println(baf); base = new DataBase(baf); base.readBDD(); resultat = base.retourner(); if(resultat.next()){ double utiliser = resultat.getDouble("utiliser"); System.out.println(utiliser+","+taille); bar.setValue((int)(taille - utiliser)); bar.setString(Integer.toString(100*((int)(taille - utiliser))/(int)taille)+ " % "); bar.setStringPainted(true); table.setValueAt(" "+LettreDisque.get(i).toString(),i,0); table.getColumnModel().getColumn(0).setCellRenderer(composant); table.setValueAt(bar,i,1); table.getColumnModel().getColumn(1).setCellRenderer(composant); table.getColumnModel().getColumn(2).setCellRenderer(composant); if(taille-utiliser < 1){ table.setValueAt(" " + Double.toString((taille-utiliser)*1024).substring(0,5)+" Mo/"+String.valueOf(taille*1024).substring(0, 5)+" Mo",i,2); unite.addElement(false); } else{ table.setValueAt(" " + Double.toString((taille-utiliser)).substring(0,5)+" Go/"+String.valueOf(taille).substring(0, 5)+" Go",i,2); unite.addElement(true); } // for(int h=0;h<unite.size();h++) // System.out.println(unite.elementAt(h)); } base.fermer(); } tabler = table; } } catch(SQLException sqle){ System.out.println("Erreur SQL de la methode lancer"); sqle.printStackTrace();} } public Serveurs(String Nom){ this.NomServeur = Nom; this.lancer(); add(pan); setLayout(new GridLayout(1,1)); SelectionListener listener = new SelectionListener(tabler); tabler.getSelectionModel().addListSelectionListener(listener); tabler.getColumnModel().getSelectionModel().addListSelectionListener(listener); tabler.setRowSelectionAllowed(true); tabler.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); } class CompTableCellRenderer extends JPanel implements TableCellRenderer{ private static final long serialVersionUID = 1L; private JProgressBar barre; public CompTableCellRenderer(){} public JComponent getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column){ if(column == 1){ barre = (JProgressBar)value; return barre; } else{ return new JLabel(value.toString()); } } } public class SelectionListener implements ListSelectionListener { JTable table; // It is necessary to keep the table since it is not possible // to determine the table from the event's source SelectionListener(JTable table) { this.table = table; } public void valueChanged(ListSelectionEvent e) { int sel=-1; // If cell selection is enabled, both row and column change events are fired if (e.getSource() == table.getSelectionModel() && table.getRowSelectionAllowed()) { // Column selection changed sel = e.getFirstIndex(); } else if (e.getSource() == table.getColumnModel().getSelectionModel() && table.getColumnSelectionAllowed() ){ // Row selection changed sel = e.getFirstIndex(); } System.out.println("SELECTION "+sel); try{ JProgressBar barre=null; String lab=null; //on créer une nouvelle fenetre pour le disques barre = (JProgressBar)tabler.getValueAt(sel,1); lab = tabler.getValueAt(sel,0).toString(); lab = lab.substring(1,3); new DessinEspaceLibre(NomServeur,lab,tailleMax.elementAt(sel),sel,unite.elementAt(sel)); } catch(Exception exsc){ System.out.println("Erreur dans nouveau DessinEspaceLibre"); exsc.printStackTrace();} if (e.getValueIsAdjusting()) { System.out.println("TEST Adjusting..."); } } } }
Bonjour,
Je crois que j'avais déjà eut le coup, à la deuxième action, il te renvoie la bonne valeur de la ligne non?
Si c'est çà, tu met juste un :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 JTable t = new JTable() ; t.getSelectionModel().addListSelectionListener( new MonListener() ) ; public class MonListener implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { int ligneSelectionne = t.getSelectedRow() ; if(ligneSelectionne>=0) System.out.println("Ligne sélectionnée : " + ligneSelectionne ); } }
ligneSelectionne n'est jamais >= 0 :?
Je sais pas si ca va t'aider mais voici comment je me souviens avoir procédé dans un soft:
Code:
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 tontab.addKeyListener(new KeyListener(){ public void keyPressed(KeyEvent e){ System.out.println(tontab.getSelectedRow()): } public void keyReleased(KeyEvent evt){ if (evt.getKeyCode() == KeyEvent.VK_DOWN | evt.getKeyCode() == KeyEvent.VK_UP | evt.getKeyChar()== KeyEvent.VK_ENTER){ if(tab.getSelectedRow()>=0){ System.out.println(tontab.getSelectedRow()): } } } public void keyTyped(KeyEvent ev){} }); tab.addMouseListener(new MouseListener(){ public void mouseExited(MouseEvent e1) { } public void mouseEntered(MouseEvent e2) { } public void mouseClicked(MouseEvent e3) { if(tab.getSelectedRow()>=0){ } if (e3.getClickCount() == 2){ } } public void mousePressed(MouseEvent e4) { } public void mouseReleased(MouseEvent e5) { } });
En fait en gros le tableau écoute le clique,le double clique,la touche haut et la touche bas.
Ps : désolé pour l'indentation:(
Ok je reviens tester après manger :lol:
et bien j'ai toujours -1 . C'est peut etre dans la definition de ma JTable que ça cloche...
Ca affiche -1 quelque soit la ligne selectionnée?
Oui
Voilà où j'en suis , toujours -1 quelque soit la méthode ou la ligne
Code:
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252 package Carte; import java.awt.GridLayout; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; import Utilitaires.DataBase; public class Serveurs extends JPanel implements Runnable{ private static final long serialVersionUID = 1L; String NomServeur; Vector <String> LettreDisque; Vector <Double> tailleMax; Vector <Boolean> unite; int pourcentage; int x = 0; int y = 20; JScrollPane pan; JTable tabler; DataBase base; ResultSet resultat; CompTableCellRenderer composant = new CompTableCellRenderer(); Thread tache; JPanel serv = this; boolean test = true; double taille; public void run(){ while(test){ try{ this.lancer(); this.updateUI(); Thread.sleep(60000); } catch(Exception ecx){ System.out.println("Erreur de sleep de SErveur"+ecx.fillInStackTrace());} } } public void stopper(){ test = false; } public void lancer(){ try{ String req="select id from appareils where nom = '"+NomServeur+"'"; System.out.println(req); base = new DataBase(req); base.readBDD(); resultat = base.retourner(); if(resultat.next() && resultat.next()){ String id = resultat.getString("id"); String[] nom = {"Disque","Espace Libre","Espace Libre","Etat"}; LettreDisque = new Vector<String>(); tailleMax = new Vector<Double>(); unite = new Vector<Boolean>(); String req1="select lettre_disque,taille from el_disques where superviser = 1 and nom = '"+NomServeur+"' order by lettre_disque"; System.out.println(req1); base.request=req1; base.readBDD(); resultat = base.retourner(); while(resultat.next()){ LettreDisque.addElement(resultat.getString("lettre_disque")); tailleMax.addElement(resultat.getDouble("taille")); } base.fermer(); Object[][] data = new Object[LettreDisque.size()][nom.length]; JTable table = new JTable(new Modele(data,nom)); table.setRowHeight(25); table.setShowGrid(false); // new ModeleListener(table); pan = new JScrollPane(table); for(int i = 0;i < LettreDisque.size();i++){ String req2="select probleme,id from erreurs where nom = '"+NomServeur+"' and probleme = '"+LettreDisque.get(i)+"' and critique = 1 and id = '"+id+"'"; System.out.println(req2); base = new DataBase(req2); base.readBDD(); resultat = base.retourner(); if(resultat.next()){ table.setValueAt(new ImageIcon("images/iconefalse.GIF"),i,3); } else{ table.setValueAt(new ImageIcon("images/iconeOK.GIF"),i,3); } base.fermer(); taille = Double.parseDouble(tailleMax.get(i).toString()); JProgressBar bar = new JProgressBar(0,(int)taille); System.out.println("taille barre"+taille); String baf="select disques.utiliser from appareils,disques where appareils.id = disques.id and appareils.id = (select max(id) from appareils where nom = '"+NomServeur+"') and description = '"+LettreDisque.get(i).toString()+"' and disques.nom = '"+NomServeur+"' and appareils.id > '"+id+"' order by description"; System.out.println(baf); base = new DataBase(baf); base.readBDD(); resultat = base.retourner(); if(resultat.next()){ double utiliser = resultat.getDouble("utiliser"); System.out.println(utiliser+","+taille); bar.setValue((int)(taille - utiliser)); bar.setString(Integer.toString(100*((int)(taille - utiliser))/(int)taille)+ " % "); bar.setStringPainted(true); table.setValueAt(" "+LettreDisque.get(i).toString(),i,0); table.getColumnModel().getColumn(0).setCellRenderer(composant); table.setValueAt(bar,i,1); table.getColumnModel().getColumn(1).setCellRenderer(composant); table.getColumnModel().getColumn(2).setCellRenderer(composant); if(taille-utiliser < 1){ table.setValueAt(" " + Double.toString((taille-utiliser)*1024).substring(0,5)+" Mo/"+String.valueOf(taille*1024).substring(0, 5)+" Mo",i,2); unite.addElement(false); } else{ table.setValueAt(" " + Double.toString((taille-utiliser)).substring(0,5)+" Go/"+String.valueOf(taille).substring(0, 5)+" Go",i,2); unite.addElement(true); } // for(int h=0;h<unite.size();h++) // System.out.println(unite.elementAt(h)); } base.fermer(); } tabler = table; } } catch(SQLException sqle){ System.out.println("Erreur SQL de la methode lancer"); sqle.printStackTrace();} } public Serveurs(String Nom){ this.NomServeur = Nom; this.lancer(); add(pan); setLayout(new GridLayout(1,1)); final ArrayList <Object> tabArray = new ArrayList<Object>(); tabler.addKeyListener(new KeyListener(){ public void keyPressed(KeyEvent e) { int i=0; for(i=0;i<LettreDisque.size();i++) { System.out.println(tabler.getSelectedRow()); } } public void keyReleased(KeyEvent evt) { if (evt.getKeyCode() == KeyEvent.VK_DOWN | evt.getKeyCode() == KeyEvent.VK_UP | evt.getKeyChar()== KeyEvent.VK_ENTER) { if(tabler.getSelectedRow()>=0) { System.out.println(tabler.getSelectedRow()); } } } public void keyTyped(KeyEvent ev){}}); tabler.addMouseListener(new MouseListener() { public void mouseExited(MouseEvent e1) { if(e1.getButton()==e1.BUTTON1) System.out.println(tabler.getSelectedRow()); } public void mouseEntered(MouseEvent e2) { if(e2.getButton()==e2.BUTTON2) System.out.println(tabler.getSelectedRow()); } public void mouseClicked(MouseEvent e3) { if(tabler.getSelectedRow()>=0) { } if (e3.getClickCount() == 2) { } } public void mousePressed(MouseEvent e4) { if(e4.getButton()==e4.BUTTON3) System.out.println(tabler.getSelectedRow()); } public void mouseReleased(MouseEvent e5) { if(e5.getButton()==e5.MOUSE_WHEEL) System.out.println(tabler.getSelectedRow()); } }); // try{ // JProgressBar barre=null; // String lab=null; // //on créer une nouvelle fenetre pour le disques // barre = (JProgressBar)tabler.getValueAt(sel,1); // lab = tabler.getValueAt(sel,0).toString(); // lab = lab.substring(1,3); // new DessinEspaceLibre(NomServeur,lab,tailleMax.elementAt(sel),sel,unite.elementAt(sel)); // } // catch(Exception exsc){ // System.out.println("Erreur dans nouveau DessinEspaceLibre"); // exsc.printStackTrace();} } class CompTableCellRenderer extends JPanel implements TableCellRenderer{ private static final long serialVersionUID = 1L; private JProgressBar barre; public CompTableCellRenderer(){} public JComponent getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column){ if(column == 1){ barre = (JProgressBar)value; return barre; } else{ return new JLabel(value.toString()); } } } }
Euh ta JTable c'est tabler ou table?car la tu ecoutes le tableau tabler et je ne vois nul part tabler = new JTable(....
Ah non j'ai rien dit tabler=table...désolé
Essaie peut-etre avec :Code:TonModel.getSelectedRow();
Oki je v tester
Je n'ai pas de listselectionmodel pour faire ça , avec la methode getselectionModele() de JTable.
Ma Jtable est initialisé comme ca :
et Modele.javaCode:
1
2
3 dat = new Modele(data,nom); JTable table = new JTable(dat);
J'espere que ca vous va aiderCode:
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 package Carte; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; class ModeleListener implements TableModelListener { private static final long serialVersionUID = 1L; public ModeleListener(JTable table){ table.getModel().addTableModelListener(this); } public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); } } public class Modele extends AbstractTableModel { private static final long serialVersionUID = 1L; private String[] nom; private Object[][] data; public Modele(Object[][] data,String[] nom){ this.data = data; this.nom = nom; } public int getColumnCount() { return nom.length; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return nom[col]; } public Object getValueAt(int row, int col) { return data[row][col]; } public Class <?> getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int col) { return false; } public void setValueAt(Object value, int row, int col) { data[row][col] = value; fireTableCellUpdated(row, col); } }
Quand tu fais tabler=table, je ne sais pas si tabler prend bien le modéle de table.
Mais l'interface TableModeListener te sert à quoi là?retire le pour voir.
Re, je relance la discussion car je n'ai toujours pas toruvé la solution à mon problème : effectuer une action quand je clique sur une ligne de ma JTable (je veux le numéro de la ligne cliquée)
Pour aider , j'ai réussi à faire une class JTable simple qui renvoi correctmeent le numéro de la ligne et effectuer l'action du click un seul fois ...
Code:
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 package Carte; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; public class Table extends JFrame{ JTextArea txt = new JTextArea(4, 20); // The TableModel controls all the data: JTable table; public Table() { this.setSize(200,200); Container cp = getContentPane(); table = new JTable(new DataModel()); cp.add(new JScrollPane(table)); cp.add(BorderLayout.SOUTH, txt); table.addMouseListener(new MouseListener(){ public void mouseClicked(MouseEvent evt){ System.out.println(table.getSelectedRow()); } public void mouseEntered(MouseEvent er){} public void mouseExited(MouseEvent ep){} public void mousePressed(MouseEvent ek){} public void mouseReleased(MouseEvent ee){} }); } class DataModel extends AbstractTableModel { Object[][] data = { {"one", "two", "three", "four"}, {"five", "six", "seven", "eight"}, {"nine", "ten", "eleven", "twelve"}, }; // Prints data when table changes: class TML implements TableModelListener { public void tableChanged(TableModelEvent e){ txt.setText(""); // Clear it for(int i = 0; i < data.length; i++) { for(int j = 0; j < data[0].length; j++) txt.append(data[i][j] + " "); txt.append("\n"); } } } public DataModel() { addTableModelListener(new TML()); } public int getColumnCount() { return data[0].length; } public int getRowCount() { return data.length; } public Object getValueAt(int row, int col) { return data[row][col]; } public void setValueAt(Object val, int row, int col) { data[row][col] = val; // Indicate the change has happened: fireTableDataChanged(); } public boolean isCellEditable(int row, int col) { return true; } } public static void main(String[] args) { new Table(); } } ///:~
J'ai pas lu toute la discussion, juste le début, mais si tu veux récupérer la ligne ou la cellule sur laquelle tu a cliqué, utilises ce que je fais pour le tooltip de ma JTable :
En espérant que ça t'aide un peu...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 /** * ToolTip is the value of the cell on which is the mouse. */ public String getToolTipText(MouseEvent e) { Point p = e.getPoint(); int row = rowAtPoint(p); int col = columnAtPoint(p); String tip = (String) getValueAt(row, col); if (tip != "") //$NON-NLS-1$ return tip; else { return null; } }
j'obtiens null en cliquant sur une cellule avec ta méthode ,
apres avoir essayé pleins de méthode je pense que mon code de tableau est vérolé , mais je vois pas où , a l'aide :oops:
Est ce que mon code dans la réponse 18 est correct ?
S'il n'y a rien dans ta cellule, c'est normal ;)Citation:
Envoyé par arsenik7
Sinon, ton code est bien vérolé... :P
Alors il est vérolé , rofl
Je ne suis pas sûr, mais cette partie me semble suspecte :Citation:
Envoyé par arsenik7
Parce que lorsque ton model va changer, tu ne feras qu'afficher les données qu'il contient, tu ne propageras pas l'évènement.Code:
1
2
3
4
5
6
7
8
9
10
11
12class TML implements TableModelListener { public void tableChanged(TableModelEvent e){ txt.setText(""); // Clear it for(int i = 0; i < data.length; i++) { for(int j = 0; j < data[0].length; j++) txt.append(data[i][j] + " "); txt.append("\n"); } } }
Essaie de rajouteren début de méthode, et si ça ne marche pas, voici un model que j'ai créé et qui fonctionne bien :Code:super.tableChanged()
Code:
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
132class MyTableModel extends AbstractTableModel { private String[] columnNames = {"A", "B", "C", "D","E"}; private ArrayList data; public MyTableModel() { // super(); data = new ArrayList(1); } /** * Supprime une ligne du tableau. * @param int row : le numéro de la ligne à supprimer. */ public void removeRow(int row) { if (data.size() > 0 && row < data.size()){ data.remove(row); } fireTableDataChanged(); centerTable(); } /** * Ajoute une ligne à la fin du tableau. * @param Object[] row : les données de la ligne à ajouter. */ public void addRow(Object[] row) { if (row != null && row.length > 0) { data.add(row); fireTableDataChanged(); } } /** * Remplace les données du tableau. * @param ArrayList newData : les nouvelles données à afficher. */ public void setData(ArrayList newData) { data = newData; fireTableDataChanged(); } public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.size(); } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { return ((Object[])data.get(row))[col]; } /* * JTable uses this method to determine the default renderer/ * editor for each cell. If we didn't implement this method, * then the last column would contain text ("true"/"false"), * rather than */ public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } /* * Don't need to implement this method unless your table's * data can change. */ public void setValueAt(Object value, int row, int col) { //TODO : à décommenter si tu veux afficher les changements... // boolean DEBUG = true; // if (DEBUG) { // System.out.println("Setting value at " + row + "," + col // + " to " + value + " (an instance of " // + value.getClass() + ")"); // } ((Object[])data.get(row))[col] = value; // fireTableCellUpdated(row, col); //TODO : à décommenter si tu veux afficher les changements... // if (DEBUG) { // System.out.println("New value of data:"); // printDebugData(); // } } private void printDebugData() { int numRows = getRowCount(); int numCols = getColumnCount(); for (int i=0; i<numRows; i++) { System.out.print(" row " + i + ":"); for (int j=0; j<numCols; j++) { // System.out.print(" " + data[i][j]); System.out.print(" " + ((Object[])data.get(i))[j]); } System.out.println(); } System.out.println("--------------------------"); } public int getMaxLength(){ int res = -1; for (int i=0; i<data.size(); i++) { for (int j=0; j<((Object[])data.get(i)).length; j++) { res = Math.max(res,((Object[])data.get(i))[j].toString().length()); } } return res; } // /* // * Don't need to implement this method unless your table's // * editable. // */ // public boolean isCellEditable(int row, int col) { // //Note that the data/cell address is constant, // //no matter where the cell appears onscreen. // if (col < 2) { // return false; // } else { // return true; // } // } }
Gasp ! ca se complique , bon je comprends plus
grand chose là , il me faut un cours :lol:
Qu'est ce que tu ne comprends pas? Mon model?
C'est la même chose que ton DataModel, sauf que j'utilise une ArrayList au lieu d'un Object[][] pour stocker mes données (ce qui est plus pratique pour l'ajout et la suppression dynamique de lignes)
Si t'as essayé et que ça ne marche pas, jette un oeil au tuto Sun
ENFIN merci pour le tuto SUN , j'ai réussi à obtenir le numéro d la ligne selectionnée :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ... //Ask to be notified of selection changes. ListSelectionModel rowSM = table.getSelectionModel(); rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { //Ignore extra messages. if (e.getValueIsAdjusting()) return; ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if (lsm.isSelectionEmpty()) { ...//no rows are selected } else { int selectedRow = lsm.getMinSelectionIndex(); ...//selectedRow is selected } } });