Gli obiettivi di questa esercitazione sono: imparare a utilizzare i gestori del layout e gli ascoltatori di eventi dell'AWT, saper costruire semplici interfacce utente grafiche (capitolo 12).
Raccomandazioni: Ove non altrimenti indicato, rispondete alle domande prima ragionando su carta e poi provando a editare, compilare ed eseguire. Gli esercizi etichettati con l'asterisco (*) sono più difficili: affrontateli dopo aver risolto gli altri.
Obiettivo: capire come usare gli ascoltatori interni ed esterni, con e senza parametri nel costruttore.
Attività:
public class Es1 {
public static void main(String[] args) {
Finestra1 f = new Finestra1();
f.pack();
f.setVisible(true);
}
}
import java.awt.*;
import java.awt.event.*;
public class Finestra1 extends Frame {
public Finestra1() {
Label etichetta;
etichetta = new Label("Questo testo cambia quando premi il pulsante",Label.CENTER);
Button pulsante = new Button("Premi per cambiare il testo sopra");
this.add(etichetta,BorderLayout.NORTH);
this.add(pulsante,BorderLayout.SOUTH);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
pulsante.addActionListener(new CambiaTesto());
}
class CambiaTesto implements ActionListener {
private int conta=1;
public void actionPerformed(ActionEvent e) {
etichetta.setText("Hai premuto "+(conta++)+" volt"+(conta<2?"a":"e"));
}
}
}
Il codice contiene un errore. Quale? Provate a cercarlo senza
compilare.Label etichetta;? Dove va messa? Perché?Finestra1:
import java.awt.*;
import java.awt.event.*;
public class Finestra2 extends Frame {
public Finestra2() {
Label etichetta;
etichetta = new Label("Questo testo cambia quando premi il pulsante",Label.CENTER);
Button pulsante = new Button("Premi per cambiare il testo sopra");
this.add(etichetta,BorderLayout.NORTH);
this.add(pulsante,BorderLayout.SOUTH);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
pulsante.addActionListener(new CambiaTesto());
}
}
class CambiaTesto implements ActionListener {
private int conta=1;
public void actionPerformed(ActionEvent e) {
etichetta.setText("Hai premuto "+(conta++)+" volt"+(conta<2?"a":"e"));
}
}
Quali sono le differenze con la prima versione? Questa seconda versione viene
compilata senza errori? Spostando la riga di codice Label etichetta;,
come nell'attività precedente, viene compilata senza errori? Perché?Finestra1 e Finestra2:
import java.awt.*;
import java.awt.event.*;
public class Finestra3 extends Frame {
public Finestra3() {
Label etichetta;
etichetta = new Label("Questo testo cambia quando premi il pulsante",Label.CENTER);
Button pulsante = new Button("Premi per cambiare il testo sopra");
this.add(etichetta,BorderLayout.NORTH);
this.add(pulsante,BorderLayout.SOUTH);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
pulsante.addActionListener(new CambiaTesto(...));
}
}
class CambiaTesto implements ActionListener {
private int conta=1;
private Label etichetta;
public CambiaTesto(Label etichetta) {this.etichetta = etichetta;}
public void actionPerformed(ActionEvent e) {
etichetta.setText("Hai premuto "+(conta++)+" volt"+(conta<2?"a":"e"));
}
}
Cosa dovete sostituire ai puntini per far compilare correttamente il programma?Finestra1 con Finestra3
nel programma Es1 e verificate che tutto funzioni bene. etichetta in CambiaTesto
con la parola lab. Funziona tutto correttamente o si deve cambiare
anche qualcosa nel codice di Finestra3? Perché?Label etichetta; come nella prima
attività funziona ancora tutto correttamente? Perché?Finesta1 e Finestra3 è una finestra
con ascoltatore interno? Quale tra le due è una finestra con ascoltatore
esterno con passaggio di parametro?Obiettivo: saper utilizzare i gestori del layout.
Attività:
import java.awt.*;
import java.awt.event.*;
public class Es2 {
public static void main(String[] args) {
Frame f = new Frame();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
...
f.add(new Button("B1"));
f.add(new Button("B2"));
f.setBounds(100,100,200,200);
f.setVisible(true);
}
}
Es2 per aggiungere un Panel
con sfondo rosso e con due nuovi pulsanti nella parte alta della finestra.
I pulsanti B1 e B2 devono essere uno a destra e
l'altro a sinistra. (Suggerimento: fate attenzione al gestore
del layout della finestra)Panel con gli opportuni gestori
del layout, modificate il codice di Es2 per far apparire due
pulsanti a sinistra, tre a destra ed uno al centro. Il pulsante al centro
non deve cambiare dimensione quando si cambia la dimensione
della finestra.Obiettivo: saper utilizzare il meccanismo degli eventi dell'AWT.
Attività:
import java.awt.*;
import java.awt.event.*;
public class Es3 {
public static void main(String[] args) {
Frame f = new Frame();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Panel centrale = new Panel();
Button ba = new Button("a");
Button bb = new Button("b");
Button bc = new Button("c");
centrale.add(ba);
centrale.add(bb);
centrale.add(bc);
Label display = new Label();
f.add(centrale,BorderLayout.CENTER);
f.add(display,BorderLayout.NORTH);
ba.addActionListener(new Echo(display));
f.setVisible(true);
}
}
class Echo implements ActionListener {
private Label l;
public Echo(Label l) {this.l = l;}
public void actionPerformed(ActionEvent e) {
String display = l.getText();
String nuovodisplay = display.concat(e.getActionCommand());
l.setText(nuovodisplay);
}
}
Aggiungere le opportune righe di codice a Es3 per fare in modo
che anche i pulsanti b e c, quando vengono premuti,
aggiungano lettere al display.b aggiungano lettere a quello in alto, mentre c
a quello in basso.Es3 fare in modo che il pulsante c
aggiunga lettere ad entrambi i display.
import java.awt.*;
import java.awt.event.*;
public class Es4 {
public static void main(String[] args) {
Frame f = new FinestraColori();
f.setVisible(true);
}
}
class FinestraColori extends Frame {
private Panel pannelloColorato;
private Color colore;
private Label l_colore;
public FinestraColori() {
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Panel p1 = new Panel();
p1.setLayout(new BorderLayout());
Button b_rosso = new Button("rosso");
b_rosso.addActionListener(new SelezionaRosso());
Button b_verde = new Button("verde");
...
l_colore = new Label("rosso",Label.CENTER);
colore = Color.red;
pannelloColorato = new Panel();
pannelloColorato.setBackground(colore);
p1.add(b_rosso,BorderLayout.NORTH);
p1.add(b_verde,BorderLayout.SOUTH);
p1.add(l_colore,BorderLayout.CENTER);
add(p1,BorderLayout.EAST);
add(pannelloColorato,BorderLayout.CENTER);
Button cambiaColore = new Button("colora");
add(cambiaColore,BorderLayout.SOUTH);
setBounds(100,100,300,200);
....addActionListener(new ColoraPannello());
}
class ColoraPannello implements ActionListener {
public void actionPerformed(ActionEvent e) {
pannelloColorato.setBackground(colore);
pannelloColorato.repaint(1);
}
}
class SelezionaRosso implements ActionListener {
public void actionPerformed(ActionEvent e) {
colore = Color.red;
l_colore.setText("rosso");
}
}
class SelezionaVerde implements ActionListener {
public void actionPerformed(ActionEvent e) {
colore = Color.green;
l_colore.setText("verde");
}
}
}
FinestraColori
e non quello degli ascoltatori, fare in modo che quando si clicca sui pulsanti
rosso e verde il pannello venga colorato del colore
corrispondente.SelezionaRosso e SelezionaVerde.
Modificate il codice di FinestraColori per far utilizzare solo
il nuovo ascoltatore.
Last modified:
2003-05-20