GridBagLayout

0

Witam. Mam problem z GridBagLayoutem. Co musze zrobić żeby elementy dodane zajmowały całą powierzchnię panelu na ktorym zastosowalem GridBagLayout? Nie moge wpisać ich rozmiarów ponieważ okno może zmieniać swoją wielkość. To kod metody init w moim aplecie.

setLayout(new BorderLayout()); 
        panel2 = new JPanel(card = new CardLayout()); 
        GridBagLayout lay; 
        lista = new JTextArea(); 
        panel = new JPanel(); 
        panel.setLayout(lay = new GridBagLayout()); 
        wyslij = new JButton("Wyslij"); 
        wyslij.addActionListener(new akcjaWyslania()); 
        mojaWiadomosc = new JTextField("bghfg"); 
        mojaWiadomosc.addKeyListener(new WyslanieEnterem()); 
        rozmowa = new JTextArea(); 
        rozmowa.setEditable(false); 
        rozmowa.setMargin(new Insets(5, 10, 5, 10)); 
        JScrollPane pans = new JScrollPane(rozmowa); 
        
        GridBagConstraints cons = new GridBagConstraints(); 

        cons.fill = GridBagConstraints.BOTH; 
        cons.gridwidth = 2; 
        cons.gridheight = 1; 
        lay.setConstraints(pans, cons); 
        panel.add(pans); 
        cons.gridwidth = GridBagConstraints.REMAINDER; 
        cons.gridheight = 2; 
        
        JScrollPane przewijanieListy = new JScrollPane(lista); 
        lay.setConstraints(przewijanieListy, cons); 
        panel.add(przewijanieListy); 
        cons.gridheight = 1; 
        cons.gridwidth = GridBagConstraints.RELATIVE; 
    
        lay.setConstraints(mojaWiadomosc, cons); 
        panel.add(mojaWiadomosc); 
        cons.gridwidth = GridBagConstraints.RELATIVE; 
      
        lay.setConstraints(wyslij, cons); 
        panel.add(wyslij); 
        panel.setBounds(0, 0, getWidth(), getHeight()); 
        panel2.add("panel", panel); 
        obecni = new LinkedList<String>();        
        lista.setEditable(false); 
        panelLogowania = new JPanel(); 
        panelLogowania.setLayout(new GridLayout(3, 1)); 
        login = new JTextField(); 
        potwierdzLogowanie = new JButton("Zaloguj"); 
        potwierdzLogowanie.addActionListener(new Logowanie()); 
        panelLogowania.add(new JLabel("Podaj swój login")); 
        panelLogowania.add(login); 
        panelLogowania.add(potwierdzLogowanie); 
        panel2.add("logowanie",panelLogowania); 
        card.show(panel2, "logowanie"); 
        add(panel2); 

Aha i próbowałem też dodać CardLayout do JApplet ale przy wywołaniu metody show(this,"panelLogowania") wywalało błędy.
Z góry dziękuję za pomoc i pozdrawiam.

0

Jeżeli chodzi o grid to powinno wystarczyć:

cons.fill = GridBagConstraints.BOTH;
cons.weightx = 1.0;
cons.weighty = 1.0;

Tu masz przykład z CardLayout'em:

import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JFrame;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CardTest extends JApplet {
	public final static String RED_PANEL = "red";
	public final static String GREEN_PANEL = "green";
	public final static String BLUE_PANEL = "blue";

	private JPanel cardPanel = new JPanel();
	private CardLayout card = new CardLayout();
	private JPanel red = new JPanel();
	private JPanel green = new JPanel();
	private JPanel blue = new JPanel();

	public void init() {
		red.setBackground(Color.RED);
		green.setBackground(Color.GREEN);
		blue.setBackground(Color.BLUE);

		cardPanel.setLayout(card);
		cardPanel.add(RED_PANEL, red);
		cardPanel.add(GREEN_PANEL, green);
		cardPanel.add(BLUE_PANEL, blue);

		JPanel menuBar = new JPanel();
		menuBar.setBackground(Color.GRAY);
		menuBar.setLayout(new FlowLayout(FlowLayout.CENTER));

		JButton red_but = new JButton("Czerwony");
		red_but.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				card.show(cardPanel, RED_PANEL);
			}
		});

		JButton green_but = new JButton("Zielony");
		green_but.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				card.show(cardPanel, GREEN_PANEL);
			}
		});

		JButton blue_but = new JButton("Niebieski");
		blue_but.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				card.show(cardPanel, BLUE_PANEL);
			}
		});

		menuBar.add(red_but);
		menuBar.add(green_but);
		menuBar.add(blue_but);


		getContentPane().setLayout(new BorderLayout());
		getContentPane().add(BorderLayout.CENTER, cardPanel);
		getContentPane().add(BorderLayout.SOUTH, menuBar);

		setSize(400,300);
	}

	public static void main(String args[]) {
		JFrame frame = new JFrame("CardTest");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		CardTest test = new CardTest();
		test.init();

		frame.add(BorderLayout.CENTER, test);
		frame.setSize(test.getSize());
		frame.setVisible(true);
	}
}
0

Dzieki pustak za pomoc. Ale mam jeszcze jeden problem. Teraz wszystkie komórki mam równe. Da się w jakiś sposób zasugerować rozmiar części komponentów? Chodzi mi o to żeby część miała określone wymiary a reszta żeby była przeskalowana przez GRidBagLayout tak żeby wypełnić całe okno? Próbowałem setSize() ale niedziała.

0

Już zrobiłem. Trzeba było w odpowiednim miejscu ustawić wartość pól weightx i weighty na 0. Jeszcze raz dzieki pustak ;).

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