GridBagLayout dwa małe pytania i problemy

0

Koledzy mam dwa małe problem z GridBagLayout
1 - nie rozumiem działania weightx/weighty - wiem że służą do określania odległości pomiędzy elementami przy zmianie wielkości okna. Jednak nie zauważam jakiejś różnicy przy zmianie wartości poza tym że gdyż określę 0 to są blisko siebie a 1 i dodatkowo fill na both to wypełniają całkowicie wszystko. Pośrednie wartości nic nie zmieniają.
2 - drugi problem to okno w którym mam dwa panele dodane z siatka GridBagLaout i zmiana wielkości jednego panelu po dodaniu do niego komponentów. Jak mogę zablokować żeby wielkość się nie zmieniała, albo ominąć ten efekt.

Poniżej kod programu na którym testuję układ GridBagLayout.

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Testy {
	public static void main(String[] args) {
		Okno okno = new Okno();
		okno.setVisible(true);
	}
}

class Okno extends JFrame {
	public Okno() {
		setSize(300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		add(new Panel());
	}
}

class Panel extends JPanel {
	public Panel() {

		GridBagLayout GBLd = new GridBagLayout();
		GridBagConstraints GBCd = new GridBagConstraints();
		setLayout(GBLd);

		GBCd.gridx = 0;
		GBCd.gridy = 0;
		GBCd.gridheight = 1;
		GBCd.gridwidth = 1;
		GBCd.fill = GridBagConstraints.BOTH;
		GBCd.weightx = 1;
		GBCd.weighty = 1;

		JPanel dane = new JPanel();
		dane.setBorder(BorderFactory.createLineBorder(Color.red));
		GBLd.setConstraints(dane, GBCd);
		this.add(dane);

		GBCd.gridx = 0;
		GBCd.gridy = 1;

		JPanel dane2 = new JPanel();
		dane2.setBorder(BorderFactory.createLineBorder(Color.green));
		GBLd.setConstraints(dane2, GBCd);
		this.add(dane2);

		GridBagLayout GBL = new GridBagLayout();
		GridBagConstraints GBC = new GridBagConstraints();
		dane.setLayout(GBL);

		GBC.weightx = 0.5;
		GBC.weighty = 1;
		GBC.fill = GridBagConstraints.BOTH;

		GBC.gridx = 0; // Wiersz komórki w której jest górny lewy róg obiektu (od 0 do ->)
		GBC.gridy = 0; // Kolumna komórki w której jest górny lewy róg obiektu (od 0 do ->)
		GBC.gridheight = 1; // Ile zajmuje kolumna (od 1 do ->)
		GBC.gridwidth = 1; // Ile zamuje wierszy (od 1 do ->)
		GBC.insets = new Insets(5, 5, 5, 5); // Odstępy pomiędzy elem. (góra, lewo, dół, prawo)
		// GBC.fill = GridBagConstraints.NONE; // Rodzaj wypełnienia (pion, poziom, całość, nic)
		GBC.anchor = GridBagConstraints.CENTER; // Wyrównanie (wszystkie kierunki świata)

		JLabel etyNazwisko = new JLabel("Nazwisko");
		GBL.setConstraints(etyNazwisko, GBC);
		dane.add(etyNazwisko);

		GBC.gridx = 1; // Wiersz komórki w której jest górny lewy róg obiektu (od 0 do ->)
		GBC.gridy = 0; // Kolumna komórki w której jest górny lewy róg obiektu (od 0 do ->)
		GBC.gridheight = 1; // Ile zajmuje kolumna (od 1 do ->)
		GBC.gridwidth = 1; // Ile zamuje wierszy (od 1 do ->)
		// GBC.fill = GridBagConstraints.NONE; // Rodzaj wypełnienia (pion, poziom, całość, nic)
		GBC.anchor = GridBagConstraints.CENTER; // Wyrównanie (wszystkie kierunki świata)

		JButton nazwisko = new JButton("OK");
		GBL.setConstraints(nazwisko, GBC);
		dane.add(nazwisko);

		// GBC.weightx = 0.5;
		// GBC.weighty = 0.5;

		GBC.gridwidth = GridBagConstraints.REMAINDER;

		GBC.gridx = 0; // Wiersz komórki w której jest górny lewy róg obiektu (od 0 do ->)
		GBC.gridy = 1; // Kolumna komórki w której jest górny lewy róg obiektu (od 0 do ->)
		GBC.gridheight = 1; // Ile zajmuje kolumna (od 1 do ->)
		GBC.gridwidth = 1; // Ile zamuje wierszy (od 1 do ->)
		// GBC.fill = GridBagConstraints.NONE; // Rodzaj wypełnienia (pion, poziom, całość, nic)
		GBC.anchor = GridBagConstraints.CENTER; // Wyrównanie (wszystkie kierunki świata)

		JLabel etyImie = new JLabel("Imie");
		GBL.setConstraints(etyImie, GBC);
		dane.add(etyImie);

		GBC.gridx = 1; // Wiersz komórki w której jest górny lewy róg obiektu (od 0 do ->)
		GBC.gridy = 1; // Kolumna komórki w której jest górny lewy róg obiektu (od 0 do ->)
		GBC.gridheight = 1; // Ile zajmuje kolumna (od 1 do ->)
		GBC.gridwidth = 1; // Ile zamuje wierszy (od 1 do ->)
		// GBC.fill = GridBagConstraints.NONE; // Rodzaj wypełnienia (pion, poziom, całość, nic)
		GBC.anchor = GridBagConstraints.CENTER; // Wyrównanie (wszystkie kierunki świata)

		JTextField imie = new JTextField(10);
		GBL.setConstraints(imie, GBC);
		dane.add(imie);
	}
}
0

1.Według mnie weightx/y określają procent okna jak ma zajmować komponent, a nie odległość między nimi, co ustawia się za pomocą insets.

  1. Spróbuj setFill(None), i ustaw graniczne wielkości panelu.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1