Skip navigation.
University » Corsi precedenti (it) » IGEA » 2005-06 » 13/03/06

Quarta esercitazione


Nota: a causa di un bug di Internet Explorer, questa pagina non ? visualizzata correttamente dal browser Microsoft (compare la barra di scorrimento orizzontale, che rende la consultazione difficoltosa). Si consiglia di visualizzare la pagina con Mozilla Firefox.

Scrivere un programma Java che esegua le seguenti azioni:

  1. Chiedere all'utente il titolo della finestra che si desidera creare (attraverso il metodo statico showInputDialog della classe JOptionPane).
  2. Creare una finestra con il titolo immesso dall'utente al punto 1. Mostrare la finestra (le dimensioni iniziali saranno ridotte).
  3. Chiedere all'utente se desidera aggiungere bottoni alla finestra:
    • se l'utente risponde si, chiedere all'utente quale etichetta si desidera per il bottone, creare un bottone con l'etichetta immessa ed adattare le dimensioni della finestra al suo contenuto;
    • se l'utente risponde no, le dimensioni della finestra non possono essere calcolate in base al suo contenuto; chiedere esplicitamente le dimensioni desiderate all'utente (espresse in pixel) e ridimensionare la finestra.

Infine, modificare il punto 3a in modo tale che l'utente possa addizionare alla finestra più di un bottone. Il programma dovrà continuare a chiedere all'utente di inserire l'etichetta di un nuovo bottone da addizionare, fino a quando l'utente non digiti fine.

Soluzione guidata

La soluzione proposta si compone di un'unica classe, contenente un unico metodo main:

import java.awt.*;
import javax.swing.*;
 
public class Eserc4 {
  public static void main(String[] args) {
    //contenuto del main
  }
}

D'ora in avanti descriveremo il codice del metodo main.

Per prima cosa chiediamo all'utente il titolo della finestra:

String titolo; //variabile che conterrà il titolo immesso dall'utente
titolo = JOptionPane.showInputDialog(null, "Immetti il titolo della finestra");

Il metodo statico showInputDialog della classe JOptionPane mostra una finestra di dialogo con la richiesta contenuta nel secondo parametro (la stringa Immetti il titolo della finestra). Il primo parametro può essere null oppure contenere il riferimento ad un JFrame. Nel secondo caso, la finestra in questione (di tipo JFrame) viene bloccata fino a quando l'utente non abbia immesso l'input richiesto dalla finestra di dialogo: si dice che la finestra di dialogo è di tipo modale.

Ora possiamo creare la finestra con il titolo contenuto nella variabile titolo:

JFrame finestra = new JFrame();
finestra.setTitle(titolo);
finestra.setVisible(true);

Prima di procedere, compiliamo il programma e testiamone il funzionamento! 

Chiediamo ora se l'utente vuole addizionare bottoni alla finestra. Useremo nuovamente il metodo showInputDialog; questa volta, però, disponendo di una finestra già visualizzata mostreremo la finestra di dialogo in modalità modale:

String risposta;
risposta = JOptionPane.showInputDialog(finestra, "Vuoi addizionare bottoni alla finestra? (si/no)");

Analizziamo la risposta con l'istruzione if: confrontiamo la stringa contenuta in risposta con la stringa si. Ricordiamo che per confrontare stringhe occorre usare il metodo equals (oppure compareTo) e non l'operatore ==, che confronterebbe i riferimenti. Ricordiamo anche che il corpo dell'if (e dell'else) normalmente è costituito da una sola istruzione java; se si vuole inserire più di una istruzione, occorre inserirle in un blocco (racchiuso tra parentesi graffe):

if(risposta.equals("si")) {
  //blocco dell'if: aggiungere bottoni
} else {
  //blocco dell'else: ridimensionare la finestra come scelto dall'utente
}

Affrontiamo dapprima il blocco dell'else. Chiediamo la larghezza e l'altezza della finestra all'utente:

String larghezzaStringa = JOptionPane.showInputDialog(finestra, "Immetti larghezza");
String altezzaStringa = JOptionPane.showInputDialog(finestra, "Immetti altezza");

Osserviamo che in questo modo otterremo due stringhe che, salvo errori o scherzi dell'utente, contengono la rappresentazione decimale di un numero. Il metodo setSize(int, int) della classe JFrame, però, prende in input due interi. Dobbiamo convertire in interi le due stringhe. A tal fine usiamo il metodo statico parseInt della classe Integer, che legge una stringa e ne trasforma il contenuto in un intero:

int larghezzaIntera = Integer.parseInt(larghezzaStringa);
int altezzaIntera = Integer.parseInt(altezzaStringa);
finestra.setSize(larghezzaIntera, altezzaIntera);

Perfetto, il blocco dell'else è terminato. Prima di procedere, compiliamo il programma e testiamone il funzionamento!

Passiamo quindi al blocco dell'if. Impostiamo il pannello della finestra, chiediamo all'utente l'etichetta del bottone, creiamo il bottone e lo addizioniamo al pannello:

JPanel pannello = new JPanel();
finestra.setContentPane(pannello);
String etichetta = JOptionPane.showInputDialog(finestra, "Immetti l'etichetta del bottone");
JButton bottone = new JButton(etichetta); //Costruttore con un argomento, l'etichetta del bottone
pannello.add(bottone);
finestra.pack(); //Ridimensiona la finestra adattandola al contenuto

Prima di procedere, compiliamo nuovamente il programma e testiamone il funzionamento!

Infine diamo all'utente la possibilità di addizionare più di un bottone. Qui occorre un ciclo (per esempio while), perché vogliamo far eseguire al programma un numero indefinito di passi (creazione e addizionamento di un bottone). Osserviamo che, quando il programma chiede in input all'utente l'etichetta del bottone, memorizza la risposta nella variabile etichetta. Se l'utente risponde fine dobbiamo uscire dal ciclo. Ovvero: il ciclo continua fintantoché la variabile etichetta contiene una stringa diversa da fine:

String etichetta = "";
while(!etichetta.equals("fine")) {   //Notare l'operatore not (punto esclamativo)
  //Chiedi all'utente l'etichetta
  //Aggiungi un pulsante con l'etichetta immessa
  //Ridimensiona la finestra
}

Osserviamo che il primo valore assunto dalla stringa etichetta (stringa vuota) non serve quasi a niente, perché all'inizio della prima iterazione del ciclo sarà sovrascritto dalla prima etichetta immessa dall'utente. E' importante, però, che sia diverso da fine, perché in questo modo il ciclo viene eseguito la prima volta (se all'inizio la stringa etichetta valesse fine, il ciclo non sarebbe mai eseguito).

C'è un piccolo malfunzionamento nel nostro programma: riuscite a individuarlo?

Il problema è che viene sempre creato un ultimo bottone con etichetta fine (perché?). Per risolvere il problema è sufficiente verificare, prima della creazione del bottone all'interno del ciclo, che l'etichetta immessa sia diversa da fine. Il codice complessivo del blocco dell'if diventa:

JPanel pannello = new JPanel();
finestra.setContentPane(pannello);
 
String etichetta = "";
 
while(!etichetta.equals("fine")) {
 
  etichetta = JOptionPane.showInputDialog(finestra, "Immetti l'etichetta del bottone");
 
  if(!etichetta.equals("fine")) {  //L'ultima volta, l'utente digita fine e questo codice non sarà eseguito
    JButton bottone = new JButton(etichetta);
    pannello.add(bottone);
    finestra.pack();
  }
 
}

Commenti dei visitatori

Accedi per lasciare commenti.