View Full Version : Java Swing
Bouba_Diop
07-12-2003, 14:50
Ciao a tutti
Ho provato e riprovato a creare una semplice interfaccia con la classe swing, ma non riesco a fare ciò che voglio.
In poche parole, vorrei creare una finestra come quella del disegno allegato.
Vorrei dunque creare un frame con dei pulsanti posti sulla sinistra.
Io sono riuscito a crearmi il frame e i pulsanti, però i pulsanti occupano tutto il frame.
ecco il mio programma:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Object;
public class Pannello{
public static void main(String[] args) {
JButton b1 = new JButton("Primo");
JButton b2 = new JButton("Secondo");
JButton b3 = new JButton("Terzo");
JButton b4 = new JButton("Quarto");
JButton b5 = new JButton("Quinto");
JFrame f = new JFrame("dd");
f.getContentPane().setLayout(new GridLayout(5,1));
//f.getContentPane().setLayout(new FlowLayout());
f.getContentPane().add(b1);
f.getContentPane().add(b2);
f.getContentPane().add(b3);
f.getContentPane().add(b4);
f.getContentPane().add(b5);
f.pack();
f.setVisible(true);
}
}
Grazie mille
ciao
dipende dal layout che imposti
non sono molto pratico perché evito di usare la grafica il più possibile, comunque mi pare che usando FlowLayout i pulsanti occupino lo spazio in base alla lunghezza della loro etichetta.
altrimenti devi scegliere il layout "libero" e impostare le dimensioni a mano, magari aiutandoti con un editor che faccia il lavoro sporco ;)
Realizzare GUI con le swing non è cosa semplicissima...ma con un minimo di impegno puoi avere ottime soddisfazioni...lascia stare i tool grafici tipo quello di jbuilder, non imparerai mai! Leggiti: lo Swing tutorial (http://java.sun.com/docs/books/tutorial/uiswing/)
Per generare layout completamente personalizzati occorre passare per gli oggetti GridBagLayout e GridBagConstraints. Non sono cose trascendentali, ma è necessario spenderci qualche tempo per fare un po' di prove, dopodichè la faccenda diventa più maneggevole.
import java.awt.*;
import javax.swing.*;
public class Application extends JFrame {
public static void main(String[] a) {
new Application();
}
public Application() {
JButton button1=new JButton("bottone 1");
JButton button2=new JButton("bottone 2");
JButton button3=new JButton("bottone 3");
JButton button4=new JButton("bottone 4");
JButton button5=new JButton("bottone 5");
GridBagLayout layout=new GridBagLayout();
GridBagConstraints constraints=new GridBagConstraints();
constraints.anchor=GridBagConstraints.WEST;
//BOTTONE 1
constraints.gridx=0; //indice X della cella
constraints.gridy=0; //indice Y della cella
constraints.gridwidth=1; //numero di celle occupate sull'asse X
constraints.gridheight=1; //numero di celle occupate sull'asse Y
constraints.weightx=50; //dimensione proporzionale di spazio occupato sull'asse X
constraints.weighty=0; //dimensione proporzionale di spazio occupato sull'asse Y
constraints.insets.top=25;
constraints.insets.left=15;
layout.setConstraints(button1, constraints);
//BOTTONE 2
constraints.gridx=0; //indice X della cella
constraints.gridy=1; //indice Y della cella
constraints.gridwidth=1; //numero di celle occupate sull'asse X
constraints.gridheight=1; //numero di celle occupate sull'asse Y
constraints.weightx=0; //dimensione proporzionale di spazio occupato sull'asse X
constraints.weighty=0; //dimensione proporzionale di spazio occupato sull'asse Y
constraints.insets.top=5;
layout.setConstraints(button2, constraints);
//BOTTONE 3
constraints.gridx=0; //indice X della cella
constraints.gridy=2; //indice Y della cella
constraints.gridwidth=1; //numero di celle occupate sull'asse X
constraints.gridheight=1; //numero di celle occupate sull'asse Y
constraints.weightx=0; //dimensione proporzionale di spazio occupato sull'asse X
constraints.weighty=0; //dimensione proporzionale di spazio occupato sull'asse Y
layout.setConstraints(button3, constraints);
//BOTTONE 4
constraints.gridx=0; //indice X della cella
constraints.gridy=3; //indice Y della cella
constraints.gridwidth=1; //numero di celle occupate sull'asse X
constraints.gridheight=1; //numero di celle occupate sull'asse Y
constraints.weightx=0; //dimensione proporzionale di spazio occupato sull'asse X
constraints.weighty=0; //dimensione proporzionale di spazio occupato sull'asse Y
layout.setConstraints(button4, constraints);
//BOTTONE 5
constraints.gridx=0; //indice X della cella
constraints.gridy=4; //indice Y della cella
constraints.gridwidth=1; //numero di celle occupate sull'asse X
constraints.gridheight=1; //numero di celle occupate sull'asse Y
constraints.weightx=0; //dimensione proporzionale di spazio occupato sull'asse X
constraints.weighty=0; //dimensione proporzionale di spazio occupato sull'asse Y
layout.setConstraints(button5, constraints);
//A DESTRA
constraints.gridx=1; //indice X della cella
constraints.gridy=0; //indice Y della cella
constraints.gridwidth=1; //numero di celle occupate sull'asse X
constraints.gridheight=6; //numero di celle occupate sull'asse Y
constraints.weightx=50; //dimensione proporzionale di spazio occupato sull'asse X
constraints.weighty=25; //dimensione proporzionale di spazio occupato sull'asse Y
JComponent rightGlue=new JComponent() {};
constraints.fill=GridBagConstraints.BOTH;
layout.setConstraints(rightGlue, constraints);
//IN BASSO
constraints.gridx=0; //indice X della cella
constraints.gridy=5; //indice Y della cella
constraints.gridwidth=1; //numero di celle occupate sull'asse X
constraints.gridheight=1; //numero di celle occupate sull'asse Y
constraints.weightx=50; //dimensione proporzionale di spazio occupato sull'asse X
constraints.weighty=75; //dimensione proporzionale di spazio occupato sull'asse Y
JComponent lowerGlue=new JComponent() {};
constraints.fill=GridBagConstraints.BOTH;
layout.setConstraints(lowerGlue, constraints);
getContentPane().setLayout(layout);
getContentPane().add(button1);
getContentPane().add(button2);
getContentPane().add(button3);
getContentPane().add(button4);
getContentPane().add(button5);
getContentPane().add(rightGlue);
getContentPane().add(lowerGlue);
setSize(350, 350);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Griglia");
show();
}
}
Nonostante sembri lungo e tedioso, il codice che ti ho postato (e che riproduce l'immagine da te inserita) è il frutto di un ripetuto uso del buon vecchio copia&incolla e della modifica di due o tre parametri. E' ovvio che un metodo dedicato all'impostazione dei parametri dell'oggetto GridBagConstraints avrebbe ridotto di 3 quarti la lunghezza del testo, ma, come si dice, repetita juvant.
Qualche spiegazione mi sembra dovuta.
L'oggetto GridBagLayout è la rappresentazione di una griglia virtuale in cui i singoli elementi possono occupare un numero arbitrario di celle sia lungo l'asse delle X che lungo l'asse delle Y.
L'impostazione dei parametri dei componenti (che andranno ad infilarsi nelle celle) passa attraverso l'uso di un oggetto GridBagConstraints:
gridBagLayout.setConstraints(componente, gridBagConstraints);
La domanda è come l'oggetto GridBagConstraints interagisce con la griglia virtuale:
ci sono 6 campi che devi impostare necessariamente:
gridx e gridy indicano la posizione della cella di partenza nella griglia virtuale: ad esempio se il componente "inizia" nella prima cella in alto a sinistra della griglia allora -> gridx = 0 e gridy = 0
gridwidth indica il numero di celle orizzontali occupate dal componente, gridheight idem in verticale: qui il valore è 1 se il componente occupa una sola cella, 2 o più a seconda di come vuoi che siano disposti i componenti
weigthx e weigthy sono di solito i più bizzarri da comprendere: con essi si indica la proporzione di spazio (orizzontale e verticale) che sarà assegnata al componente quando Java disegnerà la finestra. La somma complessiva dei "pesi" di tutti i componenti inseriti deve essere uguale a 100 (100 in verticale e 100 in orizzontale). Un componente può dare un contributo fisso oppure "adattarsi a ciò che rimane": in quest'ultimo caso il peso deve essere uguale a 0.
E' comprensibile un po' di depressione quando si affronta per la prima volta un GridBagLayout: ma se fai un po' di prove (magari inizia con qualcosa di più semplice, tipo una griglia di 2x2 celle con 3 bottoni) alla fine diventerà il tuo layout preferito, perchè è molto più rapido e pulito dell'uso di 3 o 4 layout diversi con pannelli che si infilano uno dentro l'altro.
PGI...per esperienza, prima di passare al GridBagLayout è necessario passare per altri Layout più semplici, quali il BorderLayout o il GridLayout...per capire i concetti che stanno dietro. Si possono ottenere discreti risultati. L'ultimo passo per realizzare GUI complesse darà l'utilizzo del GridBag...
Oddio, ad essere sincero pensavo che avesse già provato gli altri layout ma non ne fosse soddisfatto, anche perchè per spostare a in altro a sinistra un gruppo di pulsanti bisognerebbe combinarne almeno due (un BorderLayout con un pannello al centro e un BoxLayout applicato ad un pannello a "ovest" del BorderLayout) e poi bisogna pensare alla disposizione degli altri componenti nel resto della finestra.
Pensa un po' che sulla comprensione dei layout ho fatto passi da gigante proprio partendo dal layout che costruisti tu per quel famoso mp3-player ormai cent'anni fa :)
Bouba_Diop
08-12-2003, 17:57
Ciao!
Grazie a tutti per l'aiuto:)
Ho provato a modificare un pò il codice di PGI (stupendo grazie!) e sono riuscito ad aggiungere 2 pulsanti nella posizione che mi ero fissato:).
Adesso.... java fa i pulsanti a seconda della lunghezza della scritta. E' possibile impostare tutti i pulsanti della lunghezza che voglio io?
(Comunque è stato un pò traumatico capire il codice:), sono un pò duro di comprendonio, difatti alcune cose le devo rivedere:D )
grazie ancora
ciao
Originariamente inviato da cn73
lascia stare i tool grafici tipo quello di jbuilder, non imparerai mai!
io infatti non ci tengo minimamente a imparare ad usare bene swing. progettare la UI è secondo me la parte più noiosa (non certo inutile) della realizzazione di un programma
:O
Non tutti i layout swing tengono conto dell'impostazione delle dimensioni "preferite" di un componente.
Il GridBagLayout fortunatamente si.
button1.setPreferredSize(new Dimension(300, 45));
in questo caso il primo bottone della griglia è lungo 300 e alto 45, gli altri hanno la dimensione determinata dalla lunghezza della stringa.
Tieni conto che l'uso di una dimensione arbitraria non è propriamente consigliabile: non è detto infatti che il risultato ottenuto sia lo stesso su tutti i sistemi.
Bouba_Diop
13-12-2003, 08:18
Ciao
Finalmente dopo molte prove sono riuscito a maneggiare quel codice:).
Adesso, vorrei farvi un'altra domanda: E' possibile utilizzare il comando "onMouseOver" o simili in un programma java? (Io per ora so solo utilizzare "setToolTipText" )
Ho guardato un pò, ma compare sempre solo su java applet per html...
Se fosse possibile come si potrebbe cambiare lo sfondo di un pulsante quando ci passo sopra con il mouse?
grazie ciao
Originariamente inviato da recoil
io infatti non ci tengo minimamente a imparare ad usare bene swing. progettare la UI è secondo me la parte più noiosa (non certo inutile) della realizzazione di un programma
:O
Questioni di punti di vista...io la trovo la parte più divertente, non per nulla ne ho fatto il mio pezzo forte ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.