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:
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();
    }
}
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.

Le souci survient quand je veux modifier cette liste au run-time. Le code de test:
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);
    }
Ç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.

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