Bonjour,
J'ai un problème avec un JavaBean. Il s'agit d'un composant visuel dérivé d'un JPanel contenant un nombre variable de JRadioButton. Voici une version expurgée mais fonctionnelle du code:
J'utilise NetBeans. Le composant se comporte correctement au design-time avec Matisse. C'est à dire qu'il se redessine dans problème quand on modifie buttonsList, et qu'il n'y a pas de problème de persistance. Je peux par exemple poser plusieurs instances du composant, et leur affecter des listes différentes.
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 public class JPetrusRadioButtonsPanel extends JPanel implements Serializable { private String[] buttonsList = {"Paris", "Bordeaux", "La Mans", "Cournonterral"}; public JPetrusRadioButtonsPanel() { initComponents(); } private void initComponents() { JRadioButton[] JRB = new JRadioButton[buttonsList.length]; ButtonGroup buttonGroup = new ButtonGroup(); removeAll(); setBorder(BorderFactory.createTitledBorder( null, buttonsList[0], // pour debug TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Tahoma", 0, 12))); setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); for(int i = 0; i < buttonsList.length; i++){ JRB[i] = new JRadioButton(); buttonGroup.add(JRB[i]); JRB[i].setText(buttonsList[i]); JRB[i].setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); JRB[i].setMargin(new Insets(0, 0, 0, 0)); add(JRB[i]); } } public String getButtonsList(int index) { return buttonsList[index]; } public String[] getButtonsList() { return buttonsList; } public void setButtonsList(int index, String buttonsList) { this.buttonsList[index] = buttonsList; initComponents(); } public void setButtonsList(String[] buttonsList) { this.buttonsList = buttonsList; initComponents(); } }
Le souci survient quand je veux modifier cette liste au run-time. Le code de test:
Ça fonctionne presque. Le titre de la border du JPanel change immédiatement (c'est pour ça qu'il est mis à buttonsList[0], ce qui hors du contexte de debug n'a aucun sens). Mais le JPanel se vide de tout JRadioButton, sans changer de dimensions. Il faut un resizing pour que les JRadioButton voulus apparaissent, avec ajustement éventuel de la taille du composant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { jPetrusRadioButtonsPanel1.setButtonsList(1, "Petrus"); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { String[] list = {"aaaaa", "bbbbbb", "cccccc"}; jPetrusRadioButtonsPanel1.setButtonsList(list); }
Il va sans dire que j'ai essayé des paint(), repaint(), etc. et même des System.gc() dans tous les sens. Mais dans la mesure où le titre change, et les anciens JRadioButton disparaissent ...
J'ai également tenté des trucs à partir de containerDelegate, en y croyant beaucoup plus. Nada ...
Une idée ?
Merci d'avance,
Pierre
Partager