NOTA! Questo sito utilizza i cookie e tecnologie simili.

Se non si modificano le impostazioni del browser, l'utente accetta. Per saperne di piu'

Approvo

Guida Java 2D - Capitolo 42: Finestre 'esterne': creare ed estendere le JDialog.

 

JDialogLe JDialog sono finestre di 'secondo livello', utilizzate per comunicare informazioni all'utente, consentire la scelta di opzioni o l'input di dati mediante tastiera.

 

Un esempio 'precotto' di JDialog è JOptionPane, che abbiamo preso in esame nel capitolo 9 di questa guida.

 

 

 

Costruttori di JDialog:

  • JDialog()

  • JDialog(Dialog owner)

  • JDialog(Dialog owner, boolean modal)

  • JDialog(Dialog owner, String title)

  • JDialog(Dialog owner, String title, boolean modal)

  • JDialog(Frame owner)

  • JDialog(Frame owner, boolean modal)

  • JDialog(Frame owner, String title)

  • JDialog(Frame owner, String title, boolean modal)

 

Proprio come le JOptionPane (ma la cosa non dovrebbe sorprenderci poi tanto!), le JDialog possono essere attivate in maniera 'modale': possono, cioè, bloccare il thread che le ha avviate (spesso ciò significa l'intero programma, per programmi a singolo thread) finchè l'utente non chiuderà la finestra, cliccando sui pulsanti (Ok, Annulla, ...) o sul pulsante di chiusura della JDialog.

 

E' possibile attivare o disattivare questa modalità all'atto della creazione di una JDialog o mediante il metodo:

setModal(boolean b)   :   void .

 

Per una trattazione completa, si rimanda alle API ufficiali di tale componente.

 

Con un pò di pratica e (molta) pazienza, è possibile creare delle JDialog 'personalizzate', inserendovi le componenti desiderate e recuperando, poi, i valori immessi dall'utente (qualora la nostra JDialog consenta l'input, e a patto di implementare un metodo che restituisca tali valori !).

 

La porzione di codice che segue definisce due classi:

  • la classe EsempioDialogPersonalizzata, eseguibile, che - all'interno del main - istanzia una 'DialogPersonalizzata' che prende in input due parametri e, successivamente, una Message Dialog di JOptionPane, che mostra a video i valori inseriti dall'utente al passo precedente;

  • la classe DialogPersonalizzata, che estende JDialog ed implementa ActionListener: si tratta di una finestra di dialogo modale che contiene, disposti in pannelli, etichette, caselle di testo e pulsanti, e che consente all'utente di inserire dei valori; fornisce, inoltre, il metodo getData(), che restituisce un array di stringhe (il contenuto delle textfield).

 

Da notare che, per come è definita DialogPersonalizzata, il messaggio da mostrare nella JLabel posta all'interno della finestra viene inviato all'atto della creazione della stessa, ma questa è solo una mia scelta implementativa (per mostrare la flessibilità delle JDialog), non vincolante.

 

Ecco il codice:

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


public class EsempioDialogPersonalizzata
{
public static void main(String[]args)
{
String[] dati = new DialogPersonalizzata("Questa JDialog prende in input due stringhe").getData();
JOptionPane.showMessageDialog(null, "Hai inserito, per campo 1, il seguente valore: \"" + dati[0] + "\" e, per campo 2, il seguente valore: \"" + dati[1] + "\"");
System.exit(0);
}
}


class DialogPersonalizzata extends JDialog implements ActionListener
{
JTextField tf1 = new JTextField(30);
JTextField tf2 = new JTextField(30);
JButton btnOK = new JButton(" OK ");
JButton btnCancel = new JButton("Cancella");
String str1 = "";
String str2 = "";

public DialogPersonalizzata(String messaggio)
{
setTitle("Finestra JDialog personalizzata");
setModal(true);
getContentPane().setLayout(new BorderLayout());
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLocation(400,300);
getContentPane().add(new JLabel(messaggio),BorderLayout.NORTH);
JPanel pannelloInterno = new JPanel();
getContentPane().add(pannelloInterno);
pannelloInterno.setLayout(new GridLayout(2,2));
pannelloInterno.add(new JLabel("Campo 1"));
pannelloInterno.add(tf1);
pannelloInterno.add(new JLabel("Campo 2"));
pannelloInterno.add(tf2);
JPanel jp = new JPanel();
btnOK.addActionListener(this);
btnCancel.addActionListener(this);
jp.add(btnOK);
jp.add(btnCancel);
getContentPane().add(jp,BorderLayout.SOUTH);
pack();
setVisible(true);
}

public void actionPerformed(ActionEvent ae)
{
if(ae.getSource() == btnOK)
{
str1 = tf1.getText();
str2 = tf2.getText();
}
dispose();
}

public String[] getData()
{
String [] output = new String[2];
output[0] = str1;
output[1] = str2;
return output;
}
}

 

 

 
Vai all'inizio della pagina