Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[JavaBean] Affichage run-time

4 réponses
Avatar
Pierre Maurette
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:

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 sous 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:

private void jButton2ActionPerformed(java.awt.event.ActionEvent
evt) {
jPetrusRadioButtonsPanel1.setButtonsList(1, "Petrus");
jPetrusRadioButtonsPanel1.repaint();
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent
evt) {
String[] list = {"aaaaa", "bbbbbb", "cccccc"};
jPetrusRadioButtonsPanel1.setButtonsList(list);
jPetrusRadioButtonsPanel1.repaint();
}

Ç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 Maurette

4 réponses

Avatar
Harald Mouchobauer
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:

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 sous
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:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
jPetrusRadioButtonsPanel1.setButtonsList(1, "Petrus");
jPetrusRadioButtonsPanel1.repaint();
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String[] list = {"aaaaa", "bbbbbb", "cccccc"};
jPetrusRadioButtonsPanel1.setButtonsList(list);
jPetrusRadioButtonsPanel1.repaint();
}

Ç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 ?


Humm, revalidate() ?

--
DM

Avatar
Pierre Maurette
[...]
Humm, revalidate() ?


Merci, ça fonctionne. Il me reste à étudier avec Google pour comprendre
le pourquoi du comment.
La prochaine fois, je n'attendrai pas trois jours avant de poster ;-)
Merci encore et bonne journée.

--
Pierre Maurette

Avatar
Xavier Tarrago
Facile, repaint repaint et revalidate repositionne puis repaint.
Regle : Si on ajoute ou enlève des widgets, appeler revalidate.
Astuce : Si ca se passe pas correctement au repaint essayer revalidate.

hope it helps )

"Pierre Maurette" a écrit dans le message de
news:
[...]
Humm, revalidate() ?


Merci, ça fonctionne. Il me reste à étudier avec Google pour comprendre
le pourquoi du comment.
La prochaine fois, je n'attendrai pas trois jours avant de poster ;-)
Merci encore et bonne journée.

--
Pierre Maurette





Avatar
TestMan
[...]
Humm, revalidate() ?


Merci, ça fonctionne. Il me reste à étudier avec Google pour comprendre
le pourquoi du comment.
La prochaine fois, je n'attendrai pas trois jours avant de poster ;-)
Merci encore et bonne journée.



Bonjour,

Le pourquoi du comment est relativement simple, votre composant a des
coordonnées "vide" par défaut, il faut demander au gestionaire de
présentation du conteneur de refaire la présentation ( et ainsi
d'afficher votre composant selon les contraintes que vous appliqués et
la politique visuelle du gestionaire).

Voili ... pour en savoir plus, lire les tutoriaux swing ou un bon
bouquin ;-)

A+

TM