[javabean composant] Affichage run-time
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:
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:
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