Newsgroup: it.comp.java
Titolo: Come posizionare i controlli grafici?

Sto cercando di spostare i controlli grafici di una finestra in modo da
darle un aspetto accettabile.
Ho dato setLayout(FlowLayout); ma adesso no riesco più a spostare i
componenti. Mi basterebbe anche dire al gestore di lay-out di andare a capo
con l'inserimento, e invece questo continua ad aggiungerli uno dietro
all'altro fino a quando non riempie la riga, così mi trovo con casi simili a
un'etichetta alla fine di una riga e il relativo textfield all'inizio della
successiva.
Come posso fare?
Grazie

io personalmente disabilito il Layot e posiziono gli oggetti a "mano" settando i
bounds.
setLayout(null);
oggetto.setBounds(23,45,56,32);
add(oggetto);
Marco.
Ottavio Campana wrote:

--
Marco Tonoli
ma...@mail.shopware.it
http://www.shopware.it/

 
E bravo, e allora tutti i LayoutManager che ci stanno a fare, in Java,
li buttiamo nella spazzatura? :-)
Per Ottavio:
occorre scegliere il LayoutManager piu' opportuno per i tuoi scopi,
devi usare il FlowLayout SOLO se vuoi che i tuoi componenti siano messi
uno in fila all'altro.
Per layout complessi, conviene usare un insieme di pannelli piu'
semplici che messi assieme con l'opportuno layout manager formino il
layout finale che vuoi tu.
Devi quindi studiarti un attimo il BorderLayout e il GridLayot, come
minimo, e se non bastano c'e' anche il GridBagLayout. E il CardLayout,
ma quello e' per scopi particolari.
Con un po' (un po' tanta, a volte...) di pazienza si puo' realizzare 
qualsiasi layout si voglia.
Ciao,
  Marina

bounds.
E come te la cavi quando cambi le dimensioni della finestra?
--
Bye,
  Dario
ICQ: 
http://wwp.mirabilis.com/11871099
Remove anti-spam from e-mail address

darle un aspetto accettabile.
La soluzione che ho trovato io è un uso abbondante di layout manager:
nidificandoli secondo necessità.
Ecco in sintesi alcune linee guida per aiutarti a partire:
GUIDA AI LAYOUT MANAGER
1) usa il flow layout quando hai oggetti che devono assolutamente essere
sulla stessa linea (a meno che la mancanza di spazio non lo impedisca)
2) usa il border layout quando hai a che fare con maschere che hanno per
loro natura un'area centrale che prende tutto lo spazio a disposizione e uno
o più dei seguenti: un'intestazione, un piede, dei margini.
3) usa il grid layout quando hai a che fare con aree sovrapposte o
affiancate nelle quali non desideri che la parte centrale si espanda senza
chiedere permesso. Ricorda che le aree attaccate ai bordi superiori e
inferiori mantengono la loro altezza e si adattano in larghezza mentre
quelle attaccate ai bordi fanno l'inverso. L'area centrale occupa quello che
resta.
4) non usare mai il gridbag layout e non tentare nemmeno di studiarlo: è
troppo complicato in proporzione ai risultati che si ottengono. Anche gli
IDE risentono della complicazione del gridbag layout e quindi nessuno ha uno
strumnento intuitivo per utilizzarlo. Considera il gridbag layout come un
incidente di percorso che sarà silenziosamente rimosso quando sono sicuri
che nessuno andrà più a disturbarlo.
GUIDA ALLA NIDIFICAZIONE DEI LAYOUT MANAGER
Facciamo un esempio che dovresti avere a disposizione facilmente: il layout
di Internet Explorer (o di Netscape).
In alto hai una barra di menu che non fa testo: è sempre appiccicata in alto
alla finestra e non ce ne dobbiamo occupare.
Subito sotto c'è una barra di pulsanti, questi sono allineati uno di fianco
all'altro, una situazione adatta per il flow layout.
Dopo la barra degli strumenti troviamo un'area che contiene una label, di
dimensione fissa, e una combo box che si adatta automaticamente alle
dimensioni della finestra. La frase "si adatta automaticamente" fa pensare a
un border layout.
Al centro dello schermo abbiamo un'area di dimensioni adattate a quelle
della finestra (border layout, giusto?)
In basso c'è una status bar che si adatta alla larghezza del video.
E' chiaro che un border layout provvederà ad attaccare al margine superiore
la barra dei pulsanti e quella con l'indirizzo, al margine inferiore la
barra di stato e ad allargare e restringere l'area centrale.
Ma un layout manager solo non è sufficiente: occorre anche mantenere
allineati i pulsanti nella barra, e mantenere in posizione la barra con
l'indirizzo e l'elenco a discesa. Il border layout ti permette di mettere
una sola cosa a Nord, quindi questa sola cosa deve essere un layout che
contiene tutto quello che va a Nord e, dato che si tratta di due barre
sovrapposte, si tratta di un grid layout con una colonna e due righe.
Fissiamo un secondo le idee:
    Border layout
        NORTH
             Barra dei pulsanti
             Barra dell'indirizzo
       CENTER
            area centrale
        SOUTH
            Barra di stato
La barra dei pulsanti contiene degli oggetti tutti in fila, quindi è un flow
layout.
La barra dell'indirizzo contiene un oggetto di larghezza fissa (la label con
scritto Address) e un elenco a discesa di larghezza variabile, quindi un
border layout con una label a WEST e un elenco a discesa al CENTER.
Ricapitoliamo
    Border layout
        NORTH
            Grid layout (2 righe 1 colonna)
                Flow layout
                    Pulsante1
                    Pulsante2
                    ....
                    PulsanteN
            Border layout
                WEST
                    Label
                CENTER
                    Drop down listbox
        CENTER
            area centrale
        SOUTH
            Barra di stato
Fai una prova e vedrai che con un po' di abitudine si individuano le diverse
tipologie di aree e si impara a comporre l'alberello di widget nel modo
adatto.
Noterai un'altra cosa: da un disegno su un tovagliolo di carta si arriva ad
un'interfaccia finita che risponde al resize in maniera molto migliore di
un'applicazione di Windows tradizionale (anche se cominciano ad esserci
degli embrioni di controllo del posizionamento anche in Windows).
Si tratta infatti di widget nati al tempo in cui tutti si programmava su
Unix con l'editor vi senza nemmeno pensare ad avere un IDE e strumenti di
disegno interattivo. Le gerarchie di widget e i componenti che controllano
la geometria dei loro figli erano una risposta a questo problema.
Adesso, i layout manager sono ancora comodi perché ti liberano dal dovere
scrivere un handler per l'evento resize che faccia tutti i calcoli
necessari.
L'inconveniente è che gli eventi si propagano più lentamente e l'interfaccia
complessiva è più lenta. Questa lentezza si percepisce tanto meno quanto più
è veloce la VM Java.
Quasi tutti i toolkit grafici per Unix hanno dei layout manager e, in fin
dei conti, Gosling era nel team di progetto di Open Look.


Con tutto il rispetto per il nome che porti, mi sembra che il tuo consiglio
sul rifiuto
del gridbag sia eccessivo ed ingiustificato.
Usato nella misura giusta, il gridbag consente di ottenere ottimi risultati,
difficilmente
ottenibili con altri meccanismi.
Ci sono dei casi, ad esempio, in cui non vi e' un'area dominante ed altre
aree accessorie,
come nell'esempio che fai dell'explorer, ma vi sono aree che per motivi
estetici o funzionali
devono avere spazi proporzionali sul layout.
Un esempio che mi sovviene, perche' lo sto usando ora, e' l'outlook express,
in cui vi e' un'area
a sinistra per i newsgroup (diciamo A), e due aree sulla destra per le news
(B) e per i testi (C).
Tralasciando per ora che queste aree sono ridimensionabili, supponiamo che A
sia il 25% in X e
il 100% in Y, B sia il 75% in X e il 60% in Y, C sia il 75% in X e il 40% in
Y.
Utilizzando coomponenti swing, diciamo JPanel, e' sufficiente porre:
-per A:
    - preferredSize=25,100
    - X=0, Y=0, width=1, height=0, weight X=25.0, weight Y=100.0 nel
constraint
-per B:
    - preferredSize=75,60
    - X=1, Y=0, width=1, height=1, weight X=75.0, weight Y=60.0 nel
constraint
-per C:
    - preferredSize=75,40
    - X=1, Y=1, width=1, height=1, weight X=75.0, weight Y=40.0 nel
constraint
(per tutti Anchor=Center, Fill=Both, External insets=0,0,0,0, Size
padding=0,0 nei constraints)
E' un meccanismo abbastanza ripetitivo, non mi sembra particolarmente
difficile.
All'inizio e' forse consigliabile utilizzare gridbag come "grid avanzato",
specificando sempre X e Y
ed evitando RELATIVE e REMAINDER, che in effetti possono generare un po di
confusione.
Per quanto riguarda gridbag & IDE, segnalo che JBuilder2 ha un wizard, anche
se approssimativo,
per convertire l'XYLayout di JBCL in gridbag.
Quasi mai si ottiene quello che si aveva in mente, ma almeno e' possibile
disegnare inizialmente il
layout "senza" layout manager, e dopo aver impostato il gridbag i
constraints possono essere aggiustati
a mano in modo preciso: in altri IDE la stessa operazione equivale ad
inserire il layout in un frullatore.

confusione.
 all'inizio sfido chiunque a non avere confusione nell'utilizzo di
GridBagLayout! :-)
Vorrei segnalare che io mi ritrovo costretto ad usare il GridBagLayout
quando voglio determinare le proprietà di Insets di un Container. Qualcuno
ha altre soluzioni?
Grazie in anticipo.
Pino.