PDA

Visualizza la versione completa : [Java] Swing layout


daspin
24-10-2003, 11:36
Ciao a tutti,
sto imparando a costruire interfacce grafiche con Swing, ma purtroppo non riesco ancora a produrre i risultati desiderati: vorrei creare una finestra composta da due JPanel; il primo avrà come layout un FlowLayout in cui inserirò bottoni in sequenza, il secondo invece sarà un pannello contenente un JEditorPane!!!! Il mio problema è che quando aggiungo i 2 JPanel() al Frame, questi si dividono esattamente a metà il Frame... Io, invece, vorrei che il pannello più in alto (quello col Flow Layout) sia molto più piccolo (in termini di altezza) rispetto al secondo pannello (insomma, per capirci, come un browser che ha un pannello in alto con i pulsanti e tutto il resto della finestra è utilizzato per visualizzare le pagine web!!!!)! Ho provato con i vari metodi setSize() ecc... ma senza successo!!!!!!!!!

Qualcuno mi sà aiutare?!?!?!?!?!? :confused: :confused:

Spero di essere stato chiaro!!!!!!!

LeleFT
24-10-2003, 12:03
I JFrame, come tutti (o quasi) i componenti Container di Swing hanno per default un layout di tipo BorderLayout (o GridLayout).

Se vuoi mettere i controlli dove vuoi tu puoi usare una tecnica, secondo me, molto efficace:

- Settare il layout del Container (JFrame, JPanel, ...) a null
- Impostare posizione e dimensioni dell'oggetto che vuoi aggiungere
- Aggiungerlo.

In questo modo avrai il pieno controllo dello spazio del tuo Container. Un esempio per capire:


public class MioFrame extends JFrame {
private JPanel jp;
private JTextPane jtp;
public MioFrame() {
getContentPane().setLayout(null); //tolgo il LayoutManager predefinito
jtp = new JTextPane();
jtp.setBounds(0, 0, 300, 100); // Imposto posizione e dimensione del mio JTextPane
jp = new JPanel();
jp.setBounds(0, 101, 300, 199); // Imposto posizione e dimensione del mio JPanel
setSize(300, 300); // Imposto la dimensione della finestra
getContentPane().add(jtp);
getContantPane().add(jp);
show();
}
... // Altri metodi
}


La sintassi del metodo setBounds è la seguente:
setBounds(int posizioneX, int posizioneY, int larghezza, int altezza);

posizioneX è la posizione orizzontale dell'angolo superiore sinistro del tuo oggetto da inserire

posizioneY è la posizione verticale dell'angolo superiore sinistro del tuo oggetto da inserire

larghezza e altezza sono le dimensioni del tuo oggetto.


Ciao.

daspin
24-10-2003, 13:35
Ciao,

ora ho capito perfettamente!!!!! Grazie 1000 per il consiglio!!!!!
:ciauz: :ciauz: :ciauz: :ciauz:

Popper
24-10-2003, 15:38
impostare il layout a null e sistemare "a mano" i componenti va contro la filosofia java.... a sto punto tanto vale utilizzare visual basic :p!
Evitare LayoutManagers può sembrare comodo all'inizio, ma si rivela inefficente quando devi aggiungere componenti al frame o quando devi cambiare la loro disposizione. Pensa solo all'utente che ridimensiona la finestra... funzione che nn è il caso di inibire in un browser!!

Tornando al tuo problema si risolve molto semplicemente con un pannello di appoggio con il borderlayout (è facoltativo, io lo uso sempre per comodità)


JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add( buttonPanel, BorderLayout.NORTH); // o SOUTH , dipende da dove vuoi i tasti.
contentPane.add( new JScrollPane(ilTuoJEditorPane), BorderLayout.CENTER);
this.setContentPane(contentPane);
this.setSize(new Dimension (.... quello che vuoi ... ) );
this.show();


in questo modo il LayoutManager dispone il pannello dei tasti in una riga in alto nella finestra, occupando solamente lo spazio necessario. Tutto l'area rimanete (CENTER) viene quindi riempita dal JEditorPane, inserito in questo caso in uno scroll panel.

daspin
24-10-2003, 15:57
Ciao Popper,

grazie anche a te!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

LeleFT
24-10-2003, 21:49
Originariamente inviato da Popper
[B]impostare il layout a null e sistemare "a mano" i componenti va contro la filosofia java.... a sto punto tanto vale utilizzare visual basic :p!
Evitare LayoutManagers può sembrare comodo all'inizio, ma si rivela inefficente quando devi aggiungere componenti al frame o quando devi cambiare la loro disposizione. Pensa solo all'utente che ridimensiona la finestra... funzione che nn è il caso di inibire in un browser!!


Voglio vederti ad utilizzare un BorderLayout o cose simili per produrre una finestra con una scritta ed un pulsante... Esteticamente FA SCHIFO, ma tutto sommato può risultare divertente.

Riguardo al fatto che vada contro la filosofia Java... mi domando dove te la sei inventata questa! Programmare ad oggetti non significa perdere in manegevolezza...

Per il fatto di dover ridisporre gli oggetti quando si fa un resize di una finestra... io, personalmente, non l'ho mai (e sotto lineo MAI) trovato difficoltoso.

Per ultimo... non vedo cosa c'entri VB: in C++ o Delphi come ti comporti, visto che non hai i JayoutManagers?


Ciao.

Loading