Bonjour
je souhaite remplacer ou remplir au choix les cellule d'une JTable par des JPanel ... et donc que dans la petite case il y est mon Panel ... est ce possible ?
merci d'avance ..
Bonjour
je souhaite remplacer ou remplir au choix les cellule d'une JTable par des JPanel ... et donc que dans la petite case il y est mon Panel ... est ce possible ?
merci d'avance ..
Oui : CellRenderer et CellEditor. recherche sur le forum, et accessoirement dans les tutos de sun pour comprendre comment celà fonctionne.
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.
j'ai chercher un peu sur le forum ... j'ai fait un détour par les tuto de java ( plutot bien fait d'ailleur ) mais je ne comprend pas comment modifier le renderer .. je ne saisie pas bien cette notion ...
quelqu'un a t'il une adresse utile ou qui vaut la peine d'etre vu ?
ou mieux quelqu'un qui a la patience de m'expliquer ?
voila merci
par là, à la soure officielle:
http://java.sun.com/docs/books/tutor....html#renderer
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.
Bon je me suis posé la même question il y'a 2 semaines alors je vais t'expliquer car je comprend que t'ai pas envie de te taper la doc en anglais.
Pour afficher une cellule en x,y la table demande a son model avec getValueAt et utilise un CellRenderer pour afficher le type de donnée retournée.
Pour modifier la cellule en x,y la table va rechercher la valeur getValueAt, l'affiche et appelle la méthode setValueAt quand elle est validée.
Si tu ne lui spécifie rien, la table va utiliser un renderer et un celleditor par défaut.
Dans ton cas c'est l'affichage qui compte. Tu dois donc utiliser un cellrenderer. Il existe plusieurs solutions, soit tu définit un renderer pour un type de donnée ou pour une colonne.
Dans le premier cas imaginons que tu ai un TableModel qui contient des objets "Personne" et que tu veuilles afficher l'age de la personne ainsi qu'une couleur en fonction du sexe dans le tableau.
Dans la méthode getValueAt(x,y) de ton modèle tu retourne l'objet personne et dans ton renderer tu utilise la méthodeElle retourne un Component (un jpanel par exemple ) et elle récupère entre autre l'objet renvoyé par ton TableModel : value
Code : Sélectionner tout - Visualiser dans une fenêtre à part public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
Dans l'exemple de l'objet personne, on pourrait donc imaginer:
Il ne reste plus qu'a spécifier à la JTable ton renderer pour les objets de Type "Personne":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Personne personne = (Personne)value; String age = ""+personne.getAge; Jpanel panel = new Jpanel; panel.setLayout(new GridLayout(1,1); Jlabel label = new JLabel(age); panel.add(label); if( sexe.equals("M") ) panel.setBackground(Color.BLUE); else panel.setBackground(Color.PINK); return panel; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part table.setDefaultRenderer(Personne.class,new RendererPersonne());
ok tout va bien jusque qua la derniere partie ...
je dois le specifier le renderer de ma classe en l'instanciant ?? mais je n'est pas de renderer dans ma classe je ne comprend pas bien
Voila en tres tres gros le code que je suis en train d'ecrire est ce que c'est la bonne maniere de s'y prendre pour le renderer ... parce que la ca ne fonctionne pas
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 import javax.swing.table.* ; import javax.swing.* ; import java.awt.* ; import java.awt.event.* ; import java.util.* ; public class DayTable extends JPanel implements Observer{ // protected String[] DAYS= { "Samedi","Dimanche","Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"}; protected JTable table ; protected GregorianCalendar calendar ; protected Agenda agenda ; /** Creates a new instance of DayTable */ public DayTable(Agenda agenda) { this.setSize(600, 600); this.agenda = agenda; this.agenda.addObserver(this); this.calendar = agenda.getCurrentDate() ; table = new JTable(17, 2); table.setDefaultRenderer(Task.class,new MonRenderer()); JScrollPane pane = new JScrollPane(table); } } class MonRenderer implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Task t = (Task)value; String libelle = t.getLibelle(); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(1,1)); JLabel label = new JLabel(libelle); panel.add(label); panel.setBackground(Color.BLUE); return panel; } }
j'ai essayer tout un tas de chose depuis hier mais rien ne semble y faire
En même temps si tu ne mets aucune task dans ta JTable, tu ne rique pas de voire le rendere en action (en l'occurence tu ne mets rien pour l'instant dans ta table) donc forcément, le renderer spécifique à Task n'est surement pas instancié
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.
hooo oui ...
enfin je l'est ajoute interactivement avec une vue fait adequat dont sisi il y a des tasks dans les cellules ...
(j'aurai du le preciser :$ )
Tient voila un exemple qui marche
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
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 import javax.swing.event.TableModelListener; import javax.swing.table.* ; import javax.swing.* ; import java.awt.* ; import java.util.* ; public class DayTable extends JPanel { // protected String[] DAYS= { "Samedi","Dimanche","Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"}; private JTable table ; /** Creates a new instance of DayTable */ public DayTable(int a) { SuperModel model = new SuperModel(); table = new JTable(model); table.setDefaultRenderer(Task.class,new MonRenderer()); JScrollPane pane = new JScrollPane(); this.add(pane); pane.setViewportView(table); } public static void main(String[] args) { JFrame frame = new JFrame("super test"); frame.setLayout(new GridLayout(1,1)); frame.add(new DayTable(2)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } class SuperModel implements TableModel { String[] titres = {"titre1","titre2","titre3","titre4","titre5"}; Task[][] datas = new Task[5][3]; public SuperModel() { for(int i=0;i<5;i++) { for(int j=0;j<3;j++) { datas[i][j] = new Task("[" + i + "-" + j + "]"); } } } public int getRowCount() { return 3; } public int getColumnCount() { return 5; } public String getColumnName(int columnIndex) { return titres[columnIndex]; } public Class<?> getColumnClass(int columnIndex) { return Task.class; } public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } public Object getValueAt(int rowIndex, int columnIndex) { return datas[columnIndex][rowIndex]; } public void setValueAt(Object aValue, int rowIndex, int columnIndex) { // pas éditable } public void addTableModelListener(TableModelListener l) { } public void removeTableModelListener(TableModelListener l) { } } class Task { private String libelle; public Task(String lib) { setLibelle(lib); } public String getLibelle() { return libelle; } public void setLibelle(String libelle) { this.libelle = libelle; } } class MonRenderer implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Task t = (Task)value; String libelle = t.getLibelle(); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(1,1)); JLabel label = new JLabel(libelle); panel.add(label); if((row+column)%2 == 1) { panel.setBackground(Color.WHITE); label.setForeground(Color.BLACK); } else { panel.setBackground(Color.BLACK); label.setForeground(Color.WHITE); } return panel; } }
haaaaaaa !
Impecable je l'est modifie run peu et ca fonctionne a merveille voila un probleme résolu !
Merci bien
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager