Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-12-2003, 15:50   #1
Bouba_Diop
Senior Member
 
Iscritto dal: Jun 2003
Città: Torino
Messaggi: 319
Java Swing

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
Immagini allegate
File Type: png image1.png (598 Bytes, 23 visite)
Bouba_Diop è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2003, 17:50   #2
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
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
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2003, 18:03   #3
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
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
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2003, 21:11   #4
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
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.

Codice:
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 è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2003, 14:25   #5
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
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...
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2003, 14:52   #6
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
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
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2003, 18:57   #7
Bouba_Diop
Senior Member
 
Iscritto dal: Jun 2003
Città: Torino
Messaggi: 319
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 )

grazie ancora

ciao
Bouba_Diop è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2003, 19:02   #8
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19149
Quote:
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
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2003, 21:16   #9
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Non tutti i layout swing tengono conto dell'impostazione delle dimensioni "preferite" di un componente.

Il GridBagLayout fortunatamente si.

Codice:
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.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2003, 09:18   #10
Bouba_Diop
Senior Member
 
Iscritto dal: Jun 2003
Città: Torino
Messaggi: 319
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
Bouba_Diop è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2003, 14:22   #11
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Quote:
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

Questioni di punti di vista...io la trovo la parte più divertente, non per nulla ne ho fatto il mio pezzo forte
cn73 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
eBay acquisisce Depop da Etsy per 1,2 mi...
The Elder Scrolls VI userà motore...
Action cam 8K al prezzo giusto: Insta360...
Stop improvviso per Blue Jay: la nuova s...
Lyria 3 sbarca su Gemini: adesso si può ...
Apple Watch SE 3 da 229€, con cassa da 4...
Silent Hill: Townfall potrebbe essere un...
OpenClaw, il progetto AI virale: il suo ...
Come un iPhone: davvero si può fa...
Due TV 65'' super convenienti su Amazon:...
I tuoi dati al sicuro per 10.000 anni: i...
L'IA di ByteDance genera deekfake realis...
Speciale Robot aspirapolvere in offerta:...
Apple potrebbe affidarsi a memorie 'cine...
Il nuovo OPPO Watch S arriva in Italia: ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:51.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v