Un widget personalizzato

Da Head First Java O'Reilly, capitolo 12.

Creiamo ora un'altra piccola applicazione GUI che usa un widget custom.

Estendiamo la classe JPanel per creare un pannello che contiene un ovale colorato con colori casuali, in modo da creare un effetto di passaggio tra due tinte.

import java.awt.*;
import javax.swing.JPanel;

public class MyDrawPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;

int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color begin = new Color(red, green, blue);

red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
Color end = new Color(red, green, blue);

g2d.setPaint(new GradientPaint(70, 70, begin, 150, 150, end));
g2d.fillOval(70, 70, 100, 120);
}
}

L'unico metodo che ridefiniamo (nota la direttiva override) é paintConponent(), che viene invocato dalla repaint() quando occorre ridisegnare a video la componente.

Per prima cosa la reference a Graphics viene castata a Graphics2D, questo é sempre possibile e ci permette di avere accesso a metodi più avanzati.

Creiamo due colori distinti in modo causale, poi specifichiamo il nuovo pennello che vogliamo usare, con setPaint(), specificando un gradiente costruito con i colori generati, e quindi riempiamo un ovale dipinto con quel pennello.

Questa é la classe che usa il nostro pannello:

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

public class SimpleGuiC implements ActionListener {
private JFrame frame;

public SimpleGuiC() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JButton button = new JButton("Change colors");
button.addActionListener(this);
frame.getContentPane().add(BorderLayout.SOUTH, button);

MyDrawPanel panel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.CENTER, panel);

frame.setSize(300,300);
frame.setVisible(true);
}

public void actionPerformed(ActionEvent e) {
frame.repaint();
}

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

Da notare, oltre all'uso del nostro widget custom, anche il fatto che abbiamo messo due componenti nel content del nostro frame, sfruttando le stringhe definite in BorderLayout che ci permettono di piazzare fino a 5 componenti che rispecchiano i punti cardinali, a cui si somma il CENTER.

In pratica piazziamo il bottone a sud (ovvero in basso) e il pannello in centro (che finisce per trasbordare in tutto il resto dello spazio a disposizione).

Cliccando sul bottone viene chiamata la actionPerformed(), che chiede un repaint dell'intero frame, e quindi anche della nostra componente custom, con conseguente nuova scelta di colori per il nostro oggetto ovoidale.

Nessun commento:

Posta un commento