Aggiungiamo Elementi al Frame Per poter posizionare un elemento all'interno di un frame dobbiamo utilizzare il "layout manager". Ogni contenitore (Container) ha un layout manager Quello di default per il Frame è BorderLayout, ma si può cambiare f.setLayout( new FlowLayout() )
Layout Manager FlowLayout (tutti gli elementi di seguito e a capo automatico) BorderLayout (5 posizioni.NORTH,.SOUTH,.WEAST,.EAST,.CENTER); di base è al centro GridLayout(righe, colonne) i componenti vengono aggiunti da sx a dx e dall'alto verso il basso; anche 0 per indicare un numero qualsiasi CardLayout tutti gli oggetti uno sull'altro,.show(f), e.next(f) GridBagLayout costruisce una griglia con varie righe e varie colonne di altezza e larghezza diverse, dipendenti dai GridBagConstraints dei vari elementi
Un esempio in pratica Creiamo 3 label, 3 caselle di testo e un pulsante e aggiungiamo al frame Label lab1 = new Label("nome"); Label lab2 = new Label("cognome"); Label lab3 = new Label(" "); TextField tb1 = new TextField("inserisci nome"); TextField tb2 = new TextField("inserisci cognome"); TextField tb3 = new TextField("inserisci "); Button bt1 = new Button("SALVA"); f.add(lab1); f.add(tb1); f.add(lab2); f.add(tb2); f.add(lab3); f.add(tb3);
..i vari layerManager f.setLayout(new FlowLayout() ); i vari elementi vengono posizionati uno di seguito all'altro, quando non c'è piuù posto vengono mandati a capo; è possibile specificare la distanza orizzontale e verticale tra i vari elementi FlowLayout(FlowLayout.LEFT, 10, 20)
..i vari layoutManager f.setLayout(new GridLayout(4,2)); dispone i vari elementi in 4 righe e 2 colonne. E'possibile indicare 0 righe o 0 colonne: si intende che si avranno semplicemente le colonne o le righe specificate. E' possibile indicare lo spazio in oriz e vert tra una cella e l'altra f.setLayout(new GridLayout(4,2,10,5))
BorderLayout f.setLayout(new BorderLayout()) f.add(new Button("WEST"), BorderLayout.EAST);) Allinea 4 oggetti ai bordi e uno al centro. La posizione viene decisa al momento dell'add. E' possibile specificare uno spazio in orizzontale e in verticale f.setLayout(new BorderLayout(10,5))
il CardLayout i diversi oggetti addizionati sono uno sopra l'altro…i metodi first() e last() mostreanno il primo e l'ultimo, il next() fa scorrere di un livello e alla fine ricomincia. Tutti questi metodi hanno come argomento il contenitore CardLayout cl = new CardLayout(); f.setLayout( cl );
il CardLayout può essere utilizzato per animazioni… for (cl.first(f); ;) { try { Thread.sleep(1000); } catch (InterruptedException ex) { System.out.println("Err"); } cl.next(f); System.out.println("next"); }
Layout senza layout E' possibile fissare i componenti su un contenitore utilizzando setBound e coordinate assolute rispetto al contenitore. lo 0 0 è l'angolo in alto a sinistra, il titolo è alto circa 25 pixel.. si può utilizzare setBounds o setSize e setLocation, prima dell'add al contenitore lab1.setBounds(0,30,100,20); avendo settato f.setLayout(null);
Disposizione circolare Label[ ] arrLab = new Label[12]; double cx = f.getWidth()/2 ;//centro del cerchio (x) double cy = (f.getHeight() - 25 )/ ; //centro del cerchio (y) double r = f.getWidth()/2 - 40;//raggio for (int i = 0; i < arrLab.length; i++) { arrLab[i] = new Label(); double angoloGradi = -i*(360 / arrLab.length) + 90; double angoloRadianti = angoloGradi / 180 * Math.PI; double x = cx + r * Math.cos(angoloRadianti); double y = cy - r * Math.sin(angoloRadianti); arrLab[i].setBounds((int) x - 20, (int) y -10, 40, 20); f.add(arrLab[i]); }
Panel E' possibile, anche se un po macchinoso, costruire layout complessi utilizzando i Panel (che sono anch'essi contenitori) e addizionando i Panel al Frame. Ogni panel può avere un suo layout manager E'possibile mescolare vari panel con layout diversi.
awt: contenitori e controlli tutti gli elemneti ereditano dalla classe component si dividono in contenitori (ai quali ass. layout) –Window, Frame, Panel e controlli –Label, Textfield, Button