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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
| /* Classe principale du beans (interface graphique)
*
*/
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.beans.*;
import java.util.*;
public class ColorSelector extends JPanel implements AdjustmentListener, Serializable {
private JScrollBar jscRouge = new JScrollBar(JScrollBar.HORIZONTAL);
private JScrollBar jscVert = new JScrollBar(JScrollBar.HORIZONTAL);
private JScrollBar jscBleu = new JScrollBar(JScrollBar.HORIZONTAL);
private GridLayout gridLayout1 = new GridLayout(4, 1);
// event
private ArrayList tabChangedColorListeners = new ArrayList();
public ColorSelector() {
try {
jbInit();
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void jbInit() throws Exception {
// layout
this.setLayout(gridLayout1);
// parametre
jscBleu.setMaximum(255);
jscRouge.setMaximum(255);
jscVert.setMaximum(255);
// adding
this.add(jscRouge, null);
this.add(jscVert, null);
this.add(jscBleu, null);
// listeners
jscBleu.addAdjustmentListener(this);
jscRouge.addAdjustmentListener(this);
jscVert.addAdjustmentListener(this);
}
/**
* adjustmentValueChanged of scrollbars
*
* @param e AdjustmentEvent
*/
public void adjustmentValueChanged(AdjustmentEvent e) {
// Nouvel objet nouvelle couleur
Color newColor = new Color(jscRouge.getValue(), jscVert.getValue(), jscBleu.getValue());
// Nouveau event
fireChangedColor(getBackground(), newColor);
// Change la couleur du fond
setBackground(newColor);
}
// event ChangedColorListener
public void addChangedColorListener(ChangedColorListener ccl) {
tabChangedColorListeners.add(ccl);
}
public void removeChangedColorListener(ChangedColorListener ccl) {
tabChangedColorListeners.remove(ccl);
}
public void fireChangedColor(Color oldColor, Color newColor) {
ChangedColorEvent tmpEvent = new ChangedColorEvent(this, newColor);
for (int i = 0; i < tabChangedColorListeners.size(); i++) {
((ChangedColorListener) tabChangedColorListeners.get(i)).changedColor(tmpEvent);
}
}
// setters
public void setColor(Color col) {
jscRouge.setValue(col.getRed());
jscVert.setValue(col.getGreen());
jscBleu.setValue(col.getBlue());
setBackground(col);
}
// getters
public Color getColor() {
return getBackground();
}
}
/* Objet évènement pour notre évènement personnalisé
*
*/
import java.util.EventObject;
import java.awt.*;
public class ChangedColorEvent extends EventObject {
private Color color;
// Constructeur
public ChangedColorEvent(Object source, Color col) {
super(source);
color = col;
}
// getter
public Color getColor() {
return this.color;
}
}
/* Interface pour l'évènement personnalisé
*
*/
import java.util.EventListener;
public interface ChangedColorListener extends EventListener {
public void changedColor(ChangedColorEvent cce);
}
Vous pouvez récupérer le code ici.
La classe ColorSelector est celle qui représente le composant graphiquement, on lui a ajouté 3 scrollbares et on utilise le gridLayout pour les placer. Notez que nous avons nos 3 méthodes et un ArrayList:
* addChangedColorListener(ChangedColorListener ccl)
* removeChangedColorListener(ChangedColorListener ccl)
* fireChangedColor (Color oldColor, Color newColor)
* ArrayList tabChangedColorListeners
qui servent à la gestion de notre évènement personnalisé (fireChangedColorListener est optionnelle mais elle permet de mieux structuré le code, ce que l'on cherche par l'utilisation de design pattern). Le membre : tabChangedColorListeners permet de stocker les différentes actions à effectuer lorsque la couleur change (c'est la méthode fireChangedColor qui permettra d'effectuer cette tâche).
La classe ChangedColorEvent représente l'objet évènement qui est utilisé pour décrire notre évènement de changement de couleur. La méthode getColor permet de récupérer la nouvelle couleur.
L'interface ChangedColorListener représente les différentes actions disponibles pour cette évènements (via les prototypes des méthodes qu'il faudra implémenter lors de l'utilisation). Ici nous en avons qu'une seule : changedColor.
Comme vous pouvez le voir la création de Java Beans est vraiment très simple. Nous allons maintenant voir comment intégrer notre beans dans une application concrète.
V. Intégration d'un JavaBeans dans une application
Nous allons tout simplement utilisez le Java Beans crée au IV et l'intégrer dans une Frame. Un Java Beans est un composant comme un autre, il vous suffit donc de l'utiliser comme un JLabel. Voici le code qui nous permet de tester notre sélecteur de couleur.
import javax.swing.JFrame;
import java.awt.HeadlessException;
// Import de notre Java Beans à ne pas oublier
import com.labosun.cj.javabeans.colorselector.*;
import javax.swing.*;
import java.awt.*;
public class ColorSelectorFrameTest extends JFrame {
ColorSelector cs;
JLabel lblTest;
public ColorSelectorFrameTest() throws HeadlessException {
// Inits
cs = new ColorSelector();
lblTest = new JLabel("Couleur");
// Quitte l'application quand on ferme
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(100, 300);
this.getContentPane().setLayout(new BorderLayout());
// add
this.getContentPane().add(cs, BorderLayout.CENTER);
this.getContentPane().add(lblTest, BorderLayout.SOUTH);
// Listener
cs.addChangedColorListener(new ChangedColorListener() {
/**
* changedColor
*
* @param cce ChangedColorEvent
*/
public void changedColor(ChangedColorEvent cce) {
lblTest.setText(cce.getColor().toString());
}
});
}
// main
public static void main(String[] args) {
new ColorSelectorFrameTest().show();
}
}
Vous pouvez remarquer que nous n'avons pas de particularités dans le code, nous utilisons notre sélecteur de couleur comme un JLabel ou un JButton (ajout de listeners, paramétrage du composant)... Vous pourrez trouver le code source ici et le jar executable de l'application ici.
Conclusion |
Partager