Apparemment pas .. par contre je ne m'explique pas comment on peut accéder directement du renderer à l'editor sans perdre l'événement en route... j'avais le souvenir d'un comportement différent.. au temps pour moi.
Bulbo
Version imprimable
Apparemment pas .. par contre je ne m'explique pas comment on peut accéder directement du renderer à l'editor sans perdre l'événement en route... j'avais le souvenir d'un comportement différent.. au temps pour moi.
Bulbo
Juste pour le fun, ajoute une ligne à ton exemple et retestes... je me disais bien que c'était un peu plus complexe dans mes souvenirs .. mais bon ..
Et même sans le JOptionPane qui gêne un peu le rafraîchissement, il y a un soucis de bouton qui reste enfoncé.
Il suffit d'utiliser deux boutons un pour le rendu, un pour l'édition ...
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 import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EventObject; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.WindowConstants; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.EventListenerList; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; public class TableButtonCell { public static void main(final String[] args) { final EventListenerList listeners = new EventListenerList(); final JButton button = new JButton(); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String input = JOptionPane.showInputDialog(null, "New name", button.getText()); if (input != null) { button.setText(input); } ChangeEvent event = null; for (CellEditorListener l : listeners.getListeners(CellEditorListener.class)) { if (event == null) { event = new ChangeEvent(this); } if (input != null) { l.editingStopped(event); } else { l.editingCanceled(event); } } } }); final JButton stamp = new JButton(); DefaultTableModel model = new DefaultTableModel(new Object[][] { { "Tartuffe" }, { "Tartampion" } }, new Object[] { "Title" } ); JTable table = new JTable(model); table.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { stamp.setText(String.valueOf(value)); return stamp; } }); table.getColumnModel().getColumn(0).setCellEditor(new TableCellEditor() { public boolean stopCellEditing() { return true; } public boolean shouldSelectCell(EventObject anEvent) { return true; } public void addCellEditorListener(CellEditorListener l) { listeners.add(CellEditorListener.class, l); } public boolean isCellEditable(EventObject anEvent) { return true; } public void removeCellEditorListener(CellEditorListener l) { listeners.remove(CellEditorListener.class, l); } public Object getCellEditorValue() { return button.getText(); } public void cancelCellEditing() { } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { button.setText(String.valueOf(value)); return button; } }); JFrame frame = new JFrame("My Table"); frame.setSize(640, 480); frame.getContentPane().add(new JScrollPane(table)); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); } }
Il y a plusieurs trucs que je comprends pas dans ton code Nemek et j'ai trouvé beaucoup de codes qui ressemblent au tiens sur le net.
1) Ici tu ne renvoies qu'une seule colonne, la première. OK mais comment tu choisis ta ligne ensuite.
2) ensuite tu redéfinis la méthode getTableCellRendererComponent dont les paramètres spécifient par exemple la ligne (et la colonne Oo, alors qu'on vient de spécifier qu'on voulait la premiere, où est l'intérêt?).Code:table.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() ...
3) tu n'appelles jamais cette méthode. A quel moment tu spécifies donc que tu veux telle cellule dans la première colonne?
Code:
1
2
3
4
5 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { stamp.setText(String.valueOf(value)); return stamp; }
Oh là tu viens de loin 8O
Je te conseille de lire un tutorial Java et les interface (le mot-clé, pas les IHMs)
Pour répondre
- Les renderer/editor d'une JTable sont setter par colonne. Le design suppose que les données d'une même colonne sont généralement uniformes (de même nature, de même type).
- C'est l'interface TableCellRenderer qui le définit. Lis le tutorial Sun/Oracle sur la gestion des JTable. Tu peux très bien utiliser une seule instance de renderer pour toute ton application, il faut donc bien pouvoir savoir qu'elle est la table, la ligne et la colonne concerné pour bien initialiser le renderer.
- Idem que précédemment. C'est la JTable qui appelle cette méthode comme une grande :)
Bon j'ai un autre problème maintenant. Le fait qu'il faut que j'appuie au moins une fois sur la ligne de ma JTable pour voir les résultats. Sinon je ne vois rien, pourtant la recherche s'est bien passée.
Est-ce que ton modèle (TableModel) notifie bien ces changements ?
Si ta question est de savoir si j'ai redéfini la méthode isCellEditable, la réponse est oui. Mais mon problème ne vient pas de là.
J'appuie sur mon bouton "enregistrement suivant" disons, mais il faut que j'appuie avec la souris sur chaque cellule de la ligne pour voir la modif s'afficher.
Je parle de notification de changement ...
Quand le modèle est modifié, il doit notifier les listener qui se sont enregistrés.
En fait mes JButton ne sont plus dans ma JTable. Il n'y aucun Listener dans ma JTable d'ailleurs, juste des JLabel que je demande qu'ils se mettent à jour.
Bon j'ai enfin trouvé une solution en faisant simplement tableau.repaint() après chaque changement.