[Per corso su Java vedere http://java.sun.com/docs/books/tutorial/]
Molti contenutori particolarmente sofisticati hanno un proprio layout
manager che non deve essere assegnato con setLayout.
Talvolta hanno anche propri metodi per aggiungervi componenti invece
che usare il classico metodo "add".
Due esempi gia' citati (Swing):
Pannello con barre di scorrimento (classe JScrollPane)
Contiene un solo componente,
si crea col componente gia' dentro:
scroll = new JScrollPane(comp);
oppure si crea vuoto e poi si assegna il componente contenuto:
scroll = new JScrollPane(); scroll.setViewportView(comp);
Pannello bipartito (classe JSplitPane)
Contiene due componenti,
si crea coi due componenti gia' dentro:
split = new JSplitPane(comp1,comp2);
oppure si crea vuoto e poi si assegnano i componenti contenuti uno alla
volta: split = new JSplitPane(); split.setLeftComponent(comp1);
split.setRightComponent(comp2); oppure equivalentemente
setBottomComponent e setTopComponent
Permette a piu' componenti (di solito pannelli) di condividere lo stesso
spazio.
Ogni componente viene gestita come una scheda con linguetta
sporgente. Selezionando la linguetta l'utente stabilisce quale
scheda va mostrata davanti alle altre.
Per aggiungere componenti allo schedario non si usa "add" ma si usa un metodo apposito:
La componente selezionata e' quella la cui scheda e' in questo momento davanti alle altre, e quindi quella che l'utente vede e con cui puo' interagire.
Per assegnare / ottenere la componente selezionata:
Esempio: ExTab.java (visualizza schedario dove ogni scheda contiene un'immagine, servono anche i file fiori.jpg, marebarca.jpg, bergeggi.jpg).
I metodi per gestire lo schedario (ordinamento, selezione, abilitazione / disabilitazione di schede) identificando le componenti tramite indici interi.
Barra orizzontale o verticale contenente componenti (in genere bottoni con etichette grafiche).
Puo' essere trascinata e posizionata a piacere su uno dei quattro lati
della finestra che la ospita o fuori dalla sua finestra e il sistema
automaticamente la colloca in finestra indipendente apposita.
Il contenitore deve usare BorderLayout. La toolbar deve stare in una delle quattro zone diverse da CENTER. La zona CENTER puo' ospitare (e di solito ospita) un'altra componente. Le altre tre zone devono essere vuote.
Posso aggiungere qualsiasi tipo di componenti ad una toolbar,
di solito sono bottoni.
I componenti sono disposti in fila nell'ordine in cui li ho inseriti.
Posso controllarne l'allineamento specificando
setAlignmentX/Y per ciascun bottone che aggiungo.
Esempio: toolbar con tre bottoni, uno spazio (separatore) e poi un altro bottone.
toolbar = new JToolBar(); toolbar.add(new JButton("uno")); toolbar.add(new JButton("due")); toolbar.add(new JButton("tre")); toolbar.addSeparator(); toolbar.add(new JButton("ultimo"));Vedere file ExToolbar.java (la parte centrale della finestra ospita un'immagine, serve anche i file fiori.jpg).
Per stabilire se la toolbar puo' essere spostata trascinandola:
toolbar.setFloatable(true/false);
Per implementare finestre di documento all'interno della finestra
principale di un'applicazione.
Devo avere:
Le finestre all'interno del finto schermo hanno decorazioni che forniscono i controlli tipici delle finestre a top-level (chiusura, iconificazione...), ma sono aggiunte e gestite da Swing invece che dal window manager. Per questo, possono differire dalle decorazioni delle finestre top-level (in particolare da quelle della finestra che le contiene).
L'esempio ExIntFrame.java crea una finestra (sottoclasse di JFrame) con una finestra interna:
class ExIntFRame extends JFrame { JDesktopPane desktop = null; JInternalFrame f1 = null; ExIntFRame() { desktop = new JDesktopPane(); setContentPane(desktop); f1 = new JInternalFrame("titolo 1",true,true,true,true); f1.setSize(new Dimension(200,50)); f1.setVisible(true); desktop.add(f1); setSize(new Dimension(500,500)); setVisible(true); } }Il costruttore della classe ExIntFRame stabilisce che il pannello di contenuto del frame e' un pannello desktop.
In generale f1 invece di essere un JInternalFrame sara' di una sottoclasse di JInternalFrame che definisce anche un contenuto per la finestra interna.
La gerarchia di componenti sotto di un JInternalFrame
ricalca quella che ho sotto un JFrame.
Anche un JInternalFrame ha pannello di contenuto e
devo aggiungere componenti al pannello di contenuto.
Anche JInternalFrame ha metodo pack per
stabilirne le dimensioni ottimali in base al contenuto.
Bisogna sempre assegnare le dimensioni di un internal frame
prima di visualizzarlo.
Internal frame non ricevono eventi di finestra (WindowEvent) come i frame, invece ricevono eventi di classe InternalFrameEvent, che sono analoghi.
Una finestra di dialogo (classi Dialog / JDialog) quando viene creata e' vuoto.
In Swing esistono option panels, tipi di pannelli predefiniti che si possono mettere dentro un dialogo. Contengono:
L'istruzione 1 crea un option panel cosi':
L'istruzione 2 crea dialogo che dipende funzionalmente da un frame ed ha come pannello di contenuto l'option panel appena creato. La stringa "Una domanda..." apparira' come titolo sul bordo (se il WM lo mettera').
Le istruzioni 3 e 4 dimensionano il dialogo e lo mostrano.
I due bottoni presenti nel pannello hanno automaticamente l'effetto di chiudere la finestra di dialogo, quando premuti. Chiuso il dialogo, il controllo passa all'istruzione successiva (5).
L'istruzione 5 legge il numero del bottone premuto per chiudere il dialogo.
Classe JOptionPane ha metodi per mostrare dialoghi modali dipendenti funzionalmente da un frame:
Esistono anche dialoghi predefiniti che consentono immissione di una stringa.
int n = JOptionPane.showConfirmDialog (frame, "Hai capito?", "Una domanda...", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);2)
JOptionPane.showMessageDialog(frame, "messaggio", "titolo", JOptionPane.PLAIN_MESSAGE);
Object[] options = {"questa", "quella", "l'altra"}; int n = JOptionPane.showOptionDialog(frame, "Quale delle tre?", "titolo", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, new ImageIcon("icon.gif"), options, options[2]);
Esistono costanti per indicare il bottone premuto per chiudere il dialogo: JDialog.OK_OPTION, JDialog.YES_OPTION, JDialog.NO_OPTION, JDialog.CANCEL_OPTION.
Invece la costante JDialog.CLOSE_OPTION indica che il dialogo e' stato chiuso agendo sul bordo della finestra.
In AWT:
In Swing:
Esempio (Swing): ExFileChooser.java
JColorChooser consente selezione di un colore o da una tavolozza, o mediante terna RGB (rosso, verde, blu) o mediante terna HSB (tinta, saturazione, luminosita').