Bonjour,
j'ai trouvé sur le site Decorator pattern in Java un exemple intéressant d'utilisation du design pattern decorator pour enrichir dynamiquement un composant Swing (en l'occurrence un bouton). Je vous livre ici un code source réduit permettant d'exposer le problème :
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
| public class DecoDemo extends JFrame implements ActionListener {
public DecoDemo() {
super("Deco Button");
JPanel jp = new JPanel();
getContentPane().add(jp);
jp.add(new SlashDecorator(new JButton("Slash")));
JButton quit = new JButton("Quit");
jp.add(quit);
quit.addActionListener(this);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
static public void main(String argv[]) {
new DecoDemo();
}
class Decorator extends JComponent {
public Decorator(JComponent c) {
setLayout(new BorderLayout());
add(c, BorderLayout.CENTER);
}
}
class SlashDecorator extends Decorator {
public SlashDecorator(JComponent c) {
super(c);
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
g.drawLine(0, 0, getWidth(), getHeight());
}
}
} |
Le bouton s'affiche bien avec la barre rouge. Seulement, dès que la souris passe dessus, ou lorsqu'on clique sur le bouton, la barre rouge disparaît. Pour la faire réapparaître, il est nécessaire de repeindre entièrement la fenêtre (iconification/désiconification par exemple).
Le problème vient du fait que ce n'est pas la méthode paint() du bouton qui est redéfinie, mais celle du container dans lequel il est inclus.
D'où ma question, le design pattern decorator est-il utilisable, et si oui comment, afin d'enrichir dynamiquement des composants Swing ?
Il serait tentant d'enchainer les décorations, par exemple :
new CircleDecorator(new SlashDecorator(new JButton("Slash")));
qui aurait pour effet de décorer le bouton en affichant dessus une barre et un cercle.
Partager