PDA

Visualizza la versione completa : [JAVA] GridBagConstraints


MOBILUK
06-07-2003, 05:22
ho da poco iniziato a studiare le interfacce grafiche di Java e mi sono imbattuto (come era ovvio che fosse!) nelle Swing.

Al momento sto cercando di capire in che modo funzionino le layout, e tra queste c'è una che in parte non capisco, la GridBagConstraints.

di seguito il codice si un esempio che ho trovato in rete (il programma non esegue nulla).



import javax.swing.*;

import java.awt.*;

public class Layout extends JFrame {

//Creiamo i componenti

JLabel ipLabel = new JLabel("IP host", SwingConstants.LEFT);

JLabel passwordLabel = new JLabel("Password", SwingConstants.LEFT);

JLabel fileDaInviareLabel = new JLabel("File da inviare", SwingConstants.LEFT);

JTextField ipText = new JTextField();

JPasswordField passwordText = new JPasswordField();

JTextField fileDaInviareText = new JTextField();

JButton pulsante = new JButton("Inizia TX");

// Definiamo un metodo che ci servirà per definire i limiti di layout

void impostaLimite(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) {

gbc.gridx = gx;

gbc.gridy = gy;

gbc.gridwidth = gw;

gbc.gridheight = gh;

gbc.weightx = wx;

gbc.weighty = wy;

}









public Layout() { // Il costruttore della nostra classe

super("File transfer appz");

setSize(300, 120);

setDefaultCloseOperation(EXIT_ON_CLOSE);

JPanel pannello = new JPanel();

// impostiamo le proprietà dei componenti

ipText.setEditable(true);

fileDaInviareText.setEditable(true);

passwordText.setEchoChar('*');

//definiamo il gestore di layout

GridBagLayout grigliaAvanzata = new GridBagLayout();

GridBagConstraints limite = new GridBagConstraints();

pannello.setLayout(grigliaAvanzata);

//definiamo i limiti di ogni componente e lo aggiungiamo al pannello

impostaLimite(limite,0,0,1,1,35,0); //etichetta IP host

limite.fill = GridBagConstraints.NONE;

limite.anchor = GridBagConstraints.EAST;

grigliaAvanzata.setConstraints(ipLabel,limite);

pannello.add(ipLabel);

impostaLimite(limite,1,0,1,1,65,100); //campo IP host

limite.fill = GridBagConstraints.HORIZONTAL;

grigliaAvanzata.setConstraints(ipText,limite);

pannello.add(ipText);

impostaLimite(limite,0,1,1,1,0,0); //etichetta password

limite.fill = GridBagConstraints.NONE;

limite.anchor = GridBagConstraints.EAST;

grigliaAvanzata.setConstraints(passwordLabel,limit e);

pannello.add(passwordLabel);

impostaLimite(limite,1,1,1,1,0,100); //campo password

limite.fill = GridBagConstraints.HORIZONTAL;

grigliaAvanzata.setConstraints(passwordText,limite );

pannello.add(passwordText);

impostaLimite(limite,0,2,1,1,0,0); //etichetta File da inviare

limite.fill = GridBagConstraints.NONE;

limite.anchor = GridBagConstraints.EAST;

grigliaAvanzata.setConstraints(fileDaInviareLabel, limite);

pannello.add(fileDaInviareLabel);

impostaLimite(limite,1,2,1,1,0,100); //campo File da inviare

limite.fill = GridBagConstraints.HORIZONTAL;

grigliaAvanzata.setConstraints(fileDaInviareText,l imite);

pannello.add(fileDaInviareText);

impostaLimite(limite,0,3,2,1,0,50); // Pulsante

limite.fill = GridBagConstraints.NONE;

limite.anchor = GridBagConstraints.CENTER;

grigliaAvanzata.setConstraints(pulsante,limite);

pannello.add(pulsante);

setContentPane(pannello); // rendiamo il pannello parte del nostro frame

show(); // Visualizziamo il tutto!

}





public static void main(String argv[]) {

Layout nf = new Layout();

}

}

quello che nn capisco è che funzione ha e come funziona la stringa impostaLimite(limite,x,x,x,x,x,x,); presente ad ogni elemento della finestra.

Per quanto ho capito il posizionamento degli elementi avviene specificando i punti cardinali, ma questo sembra che non basti e che bisogna tener presente una griglia che suddivide in 6 parti la finestra. Io questo non l'ho capito, se qualcuno di voi può aiutarmi gli sarò davvero riconoscente.


P.S.
Ho aperto questo thread dopo aver tentato di cercare nel forum altri thread simili, ma la ricerca nel forum è interrotta fino a lunedì. :bhò:

Pablob
06-07-2003, 07:21
Credo che il posto migliore sia questo:

http://developer.java.sun.com/developer/technicalArticles/GUI/AWTLayoutMgr/

MOBILUK
14-07-2003, 05:28
ho letto accuratamente tutta la documentazione da te segnalata, e molte cose le ho chiarite, ma esercitandomi ho cmq inconstrato alcune difficoltà, infatti con il seguente codice non vengono visualizzati tutti e 3 i pulsanti che ho creato, ma ne viene visualizzato solo uno, ed è proprio quello che ho creato ma non inserito (pulsante3).



import javax.swing.*;
import java.awt.*;



public class class_name extends JFrame {

private boolean inAnApplet = true;
JButton pulsante1, pulsante2, pulsante3, gridbag, gridBag;
JPanel p1, p2;


public class_name() {

getContentPane().setLayout(new GridLayout (1,3));
setFont(new Font("Impact", Font.PLAIN, 14));


p1 = new JPanel();
p1.setLayout(new GridLayout(8,1));
p2 = new JPanel();

p1.setBackground(Color.blue);
p2.setBackground(Color.red);
getContentPane().add(p1);
getContentPane().add(p2);

gridBag = new JButton("pulsante1");
gridBag = new JButton("pulsante2");
gridBag = new JButton("pulsante3");

p1.add(gridBag);
p1.add(new JLabel("xxxxxx"));


setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

}

public void gridBag(){

GridBagConstraints c = new GridBagConstraints();
GridBagLayout gridbag = new GridBagLayout();
p2.setLayout(gridbag);

c.fill = GridBagConstraints.BOTH;
c.weightx = 0.0;
c.gridwidth = GridBagConstraints.REMAINDER;

JLabel top = new JLabel("JLabel top");
top.setHorizontalAlignment(JLabel.CENTER);
gridbag.setConstraints(top, c);
p2.add(top);

c.insets = new Insets(15, 0, 0, 0);
c.fill = GridBagConstraints.NONE;
c.gridwidth = GridBagConstraints.RELATIVE;
pulsante1 = new JButton("Oracle");
gridbag.setConstraints(pulsante1, c);
p2.add(pulsante1);

c.gridheight = 1;
pulsante2 = new JButton("pulsante2");
gridbag.setConstraints(pulsante2, c);
p1.add(pulsante2);

}

public static void main (String args[])
{

JFrame class_name = new class_name();

}



}



in esecuzione viene visualizzata solo una finistra divisa in due pannelli (uno blu a sinistra e uno rosso a destra), e in quello di sinistra compare il pulsante3, e al di sotto di quest'ultimo la JLabel xxxxx.

E cmq leggendo la guida segnalata non ho cmq capito come usare i numeri nelle parentesi


c.insets = new Insets(15, 0, 0, 0);


in altre guide ho notato che invece di essere 4 i numeri nella parentesi sono 6, mi sembra di avrer capito che siano parametri, ma non ho capito come usarli. :bhò:


ringrazio chiunque mi aiuti

MOBILUK
14-07-2003, 19:00
...c'è nessuno? :quipy:

Zero-2
14-07-2003, 20:55
Non ho ben capito il tuo codice :(:(
Questo :


gridBag = new JButton("pulsante1");
gridBag = new JButton("pulsante2");
gridBag = new JButton("pulsante3");


e poi il metodo gridBag() che non chiami mai ...



pulsante1 = new JButton("pulsante1");
pulsante2 = new JButton("pulsante2");
pulsante3 = new JButton("pulsante3");

p1.add(pulsante1);
p1.add(pulsante2);
p1.add(pulsante3);

eliminando i due gridBag fra le variabili di classe.

Zero-2
14-07-2003, 20:58
in altre guide ho notato che invece di essere 4 i numeri nella parentesi sono 6, mi sembra di avrer capito che siano parametri, ma non ho capito come usarli.


E' strano dato che l'insets vuole i valori per:
[list=1]
top
left
bottom
right
[/list=1]

In pratica imposti lo spazio che ci deve essere nelle varie direzioni.

Loading