Due bottoni per una GUI

Da Head First Java O'Reilly, capitolo 12.

Riscriviamo la semplice Gui su cui stiamo lavorando da un po' per permetterle di gestire i comandi che arrivano da due bottoni diversi.

Questo richiede che la actionPerformed() discrimini la sorgente per decidere cosa fare o, meglio, che vi siamo due actionPerformed(), ognuna dedicata ad un compito.

Dato che non é possibile avere due metodi con lo stesso nome all'interno della stessa classe, e dato che sarebbe sgradevole delegare esternamente alla classe in cui sono definiti i bottoni la gestione dei comandi risultanti, conviene definire due classi interne (inner class) che agiscano come listener dei bottoni.

Data la MyDrawPanel definita nel precedente post, riscriviamo la classe che controlla la gui in questo modo:

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

public class TwoButtons {
private JFrame frame;
private JLabel label;

public TwoButtons() {
frame = new JFrame();
label = new JLabel("Hello");

JButton btnLabel = new JButton("Change label");
btnLabel.addActionListener(new LabelListener());

JButton btnColor = new JButton("Change color");
btnColor.addActionListener(new ColorListener());

MyDrawPanel panel = new MyDrawPanel();

frame.getContentPane().add(BorderLayout.WEST, label);
frame.getContentPane().add(BorderLayout.CENTER, panel);
frame.getContentPane().add(BorderLayout.EAST, btnLabel);
frame.getContentPane().add(BorderLayout.SOUTH, btnColor);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}

class LabelListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
label.setText("Hi!");
}
}

class ColorListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
frame.repaint();
}

}

public static void main(String[] args) {
new TwoButtons();
}
}

LabelListener e ColorListener, essendo definite come inner class, hanno accesso alle variabili di instanza della classe esterna che possono accedere direttamente.

Si può dire che le classi interne permettono di implementare la stessa interfaccia più di una volta nella stessa classe.

Nessun commento:

Posta un commento