import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; /** * Cet exercice vise a demontrer une utilisation simple de swing. * Avec une petite mise en avant des listeners. * * @author loic * @date 2009/11/3 * */ public class PustulesApp { /** * @param args non utilise */ public static void main(String[] args) { JFrame frame = new JFrame("Pustules 12.0"); frame.getContentPane().setLayout(new FlowLayout()); // 1 gestionnaire pour 3 boutons non spécialisés Gestionnaire0 gest = new Gestionnaire0(); for (int i=0; i<3; ++i) { JButton bouton = new JButton("0"); bouton.addActionListener(gest); frame.getContentPane().add(bouton); } // 1 gestionnaire par bouton spécialisé for (int i=0; i<3; ++i) { MonBouton1 bouton = new MonBouton1(); // le gestionnaire s'ajoute automatiquement au bouton new Gestionnaire1(bouton); frame.getContentPane().add(bouton); } // 1 gestionnaire par bouton, chaque bouton spécialisé est son propre gestionnaire for (int i=0; i<3; ++i) { MonBouton2 bouton = new MonBouton2(); frame.getContentPane().add(bouton); } frame.pack(); frame.setVisible(true); } } /** * Gestionnaire (listener) commun a plusieurs boutons * On se sert du texte du bouton pour le convertir en entier, * l'incrementer et remettre a jour ce texte * * LIMITATION évidente : le texte ne peut etre qu'un nombre */ class Gestionnaire0 implements ActionListener { public void actionPerformed(ActionEvent e) { // Récupérer le bouton responsable de l'evenement JButton b = (JButton)e.getSource(); int i = Integer.parseInt(b.getText()); // la conversion passe par un StringBuffer ou StringBuilder implicite b.setText(""+(++i)); } } /** * Un gestionnaire par bouton * On garde la reference du bouton dans le gestionnaire * * LIMITATION : beaucoup de creation d'objets ... */ class Gestionnaire1 extends AbstractAction { MonBouton1 bouton; public Gestionnaire1(MonBouton1 bouton) { this.bouton = bouton; bouton.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { bouton.incrementer(); } } /** * Spécialisation d'un JButton pour en faire un compteur * * AVANTAGE : utilisation des relations objets * on peut utiliser un texte qui n'est pas qu'un nombre */ class MonBouton1 extends JButton { int compteur; public MonBouton1() { super("0"); compteur = 0; } public void incrementer() { ++compteur; setText(""+compteur); } } /** * Spécialisation du JButton pour en faire un compteur * Le bouton est aussi son propre gestionnaire */ class MonBouton2 extends JButton implements ActionListener { int compteur; public MonBouton2() { super("0"); compteur = 0; addActionListener(this); } public void actionPerformed(ActionEvent e) { incrementer(); } public void incrementer() { ++compteur; setText(""+compteur); } }