GridBagLayout未按预期出现

问题描述 投票:1回答:2

我正在创建一个GUI,顶部应该有按钮,中间是一个视图屏幕,底部是一个带有标签和文本输入字段的区域,根据按下的按钮而改变。所有内容所在的主面板是GridBagLayout。保存文本输入字段的面板是CardLayout。我觉得好像我已经设置了GridBagConstraints和其他应有的东西,但它并没有像预期的那样出现。我想像我设置GridBagConstraints的方式有问题,或者可能是调整大小的问题,但我不确定。我将包括我运行时获得的图片以及我想要获得的图片。

代码:

import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Container;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.text.JTextComponent;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import java.awt.GridBagLayout;
import java.util.concurrent.Executors;
import java.awt.CardLayout;
import java.awt.GridBagConstraints;
import javax.swing.JLabel;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Dimension;
import java.awt.Insets;

public class Window extends JFrame {

    public Window() {
        Container panel = this.getContentPane();
        panel.setLayout(new GridBagLayout());
        panel.setSize(1000,1000);
        GridBagConstraints gbc = new GridBagConstraints();

        JButton ordersButton = new JButton("Orders");
        gbc.gridx = 0;
        gbc.gridy = 0;
        panel.add(ordersButton, gbc);
        JButton dishesButton = new JButton("Dishes");
        gbc.gridx = 1;
        gbc.gridy = 0;
        panel.add(dishesButton, gbc);
        JButton ingredientsButton = new JButton("Ingredients");
        gbc.gridx = 2;
        gbc.gridy = 0;
        panel.add(ingredientsButton, gbc);
        JButton suppliersButton = new JButton("Suppliers");
        gbc.gridx = 3;
        gbc.gridy = 0;
        panel.add(suppliersButton, gbc);
        JButton staffButton = new JButton("Staff");
        gbc.gridx = 4;
        gbc.gridy = 0;
        panel.add(staffButton, gbc);
        JButton dronesButton = new JButton("Drones");
        gbc.gridx = 5;
        gbc.gridy = 0;
        panel.add(dronesButton, gbc);
        JButton usersButton = new JButton("Users");
        gbc.gridx = 6;
        gbc.gridy = 0;
        panel.add(usersButton, gbc);
        JButton postcodesButton = new JButton("Postcodes");
        gbc.gridx = 7;
        gbc.gridy = 0;
        panel.add(postcodesButton, gbc);
        JButton configurationButton = new JButton("Configuration");
        gbc.gridx = 8;
        gbc.gridy = 0;
        panel.add(configurationButton, gbc);

        JTextField viewScreen = new JTextField();
        gbc.gridy = GridBagConstraints.RELATIVE;
        gbc.gridwidth = 9;
        gbc.gridheight = 2;
        viewScreen.setPreferredSize(new Dimension(650, 200));
        panel.add(viewScreen, gbc);


        JPanel ordersPanel = new JPanel();
        JPanel dishesPanel = new JPanel();

        ordersPanel.setLayout(new GridBagLayout());
        dishesPanel.setLayout(new GridBagLayout());

        ordersPanel.setSize(new Dimension(900, 500));
        dishesPanel.setSize(new Dimension(900, 500));

        JLabel orders1Label = new JLabel("order 1");
        gbc.gridx = 0;
        gbc.gridy = 0;
        ordersPanel.add(orders1Label, gbc);
        JLabel orders2Label = new JLabel("order 2");
        gbc.gridx = 0;
        gbc.gridy = 1;
        ordersPanel.add(orders2Label, gbc);
        JLabel dishes1Label = new JLabel("dish 1");
        gbc.gridx = 0;
        gbc.gridy = 0;
        dishesPanel.add(dishes1Label, gbc);
        JLabel dishes2Label = new JLabel("dish 2");
        gbc.gridx = 0;
        gbc.gridy = 1;
        dishesPanel.add(dishes2Label, gbc);

        JTextField orders1TextField = new JTextField();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.gridwidth = 4;
        ordersPanel.add(orders1TextField, gbc);
        JTextField orders2TextField = new JTextField();
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.gridwidth = 4;
        ordersPanel.add(orders2TextField, gbc);
        JTextField dishes1TextField = new JTextField();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.gridwidth = 4;
        dishesPanel.add(dishes1TextField, gbc);
        JTextField dishes2TextField = new JTextField();
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.gridwidth = 4;
        dishesPanel.add(dishes2TextField, gbc); 

        orders1TextField.setPreferredSize(new Dimension(400, 20));
        orders2TextField.setPreferredSize(new Dimension(400, 20));
        dishes1TextField.setPreferredSize(new Dimension(400, 20));
        dishes2TextField.setPreferredSize(new Dimension(400, 20));

        JPanel entryFields = new JPanel();
        CardLayout c1 = new CardLayout();
        entryFields.setLayout(c1);
        entryFields.setSize(new Dimension(900, 600));
        gbc.gridheight = 7;
        gbc.gridwidth = 9;
        gbc.weighty = 1;

        gbc.gridy = GridBagConstraints.RELATIVE;
        entryFields.add("ordersPanel",ordersPanel);
        entryFields.add("dishesPanel", dishesPanel);
        c1.show(entryFields, "ordersPanel");
        panel.add(entryFields, gbc);

        ordersButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                c1.show(entryFields, "ordersPanel");
            }
        });


        dishesButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                c1.show(entryFields, "dishesPanel");
            }
        });


        //Display window
        setSize(800,600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

    }

        public static void main(String[] args) {    
            Window win = new Window();

        }


}

出现了什么:

enter image description here

我想要的是:

enter image description here

我应该补充一点,下面的图片是我在将窗口大小调整到计算机屏幕大小之前得到的。你可以在这里看到标签,虽然你不能在全尺寸版本中,但是它们聚集在一起,所以可能这是我设定我的权重的方式的问题,我只是这样做,所以至少每一行和一列都有至少一个权重为1的组件。

enter image description here

java swing layout-manager gridbaglayout
2个回答
1
投票

好吧,让我们开始说,你对GridBagConstraints实例做的任何修改都会持久保存到该实例的以下任何用法中。 因此,如果你这样做,gbc.gridwidth = 9确保将其重置为gbc.gridwidth = 1,否则添加的每个元素都将应用9的网格宽度。每次在同一行添加一个按钮时都不需要设置gridy = 0,只需添加不必要的代码行。

现在我刚刚清理了你的Window()代码,向你展示正确使用GridBagConstraints并删除了重复的分配。你将不得不再次添加你的ActionListeners

public Window() {
    Container panel = this.getContentPane();
    panel.setLayout(new GridBagLayout());
    panel.setSize(1000,1000);

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.weightx = 1;
    gbc.weighty = 1;

    gbc.gridy = 0; // First row

    JButton ordersButton = new JButton("Orders");
    gbc.gridx = 0;
    panel.add(ordersButton, gbc);

    JButton dishesButton = new JButton("Dishes");
    gbc.gridx = 1;
    panel.add(dishesButton, gbc);

    JButton ingredientsButton = new JButton("Ingredients");
    gbc.gridx = 2;
    panel.add(ingredientsButton, gbc);

    JButton suppliersButton = new JButton("Suppliers");
    gbc.gridx = 3;
    panel.add(suppliersButton, gbc);

    JButton staffButton = new JButton("Staff");
    gbc.gridx = 4;
    panel.add(staffButton, gbc);

    JButton dronesButton = new JButton("Drones");
    gbc.gridx = 5;
    panel.add(dronesButton, gbc);

    JButton usersButton = new JButton("Users");
    gbc.gridx = 6;
    panel.add(usersButton, gbc);

    JButton postcodesButton = new JButton("Postcodes");
    gbc.gridx = 7;
    panel.add(postcodesButton, gbc);

    JButton configurationButton = new JButton("Configuration");
    gbc.gridx = 8;
    panel.add(configurationButton, gbc);

    JTextField viewScreen = new JTextField();
    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.gridwidth = 9;
    viewScreen.setPreferredSize(new Dimension(650, 200));
    viewScreen.setMinimumSize(new Dimension(650, 200));
    panel.add(viewScreen, gbc);
    gbc.gridwidth = 1;  // Reset the gridwidth

    // Third row
    JLabel orders1Label = new JLabel("order 1");
    gbc.gridx = 1;
    gbc.gridy = 2;
    panel.add(orders1Label, gbc);
    JLabel orders2Label = new JLabel("order 2");
    gbc.gridx = 1;
    gbc.gridy = 3;
    panel.add(orders2Label, gbc);
    JLabel dishes1Label = new JLabel("dish 1");
    gbc.gridx = 1;
    gbc.gridy = 4;
    panel.add(dishes1Label, gbc);
    JLabel dishes2Label = new JLabel("dish 2");
    gbc.gridx = 1;
    gbc.gridy = 5;
    panel.add(dishes2Label, gbc);

    gbc.gridwidth = 4; // Textfield width
    JTextField orders1TextField = new JTextField();
    gbc.gridx = 2;
    gbc.gridy = 2;
    panel.add(orders1TextField, gbc);
    JTextField orders2TextField = new JTextField();
    gbc.gridx = 2;
    gbc.gridy = 3;
    panel.add(orders2TextField, gbc);
    JTextField dishes1TextField = new JTextField();
    gbc.gridx = 2;
    gbc.gridy = 4;
    panel.add(dishes1TextField, gbc);
    JTextField dishes2TextField = new JTextField();
    gbc.gridx = 2;
    gbc.gridy = 5;
    panel.add(dishes2TextField, gbc); 

    orders1TextField.setPreferredSize(new Dimension(400, 20));
    orders2TextField.setPreferredSize(new Dimension(400, 20));
    dishes1TextField.setPreferredSize(new Dimension(400, 20));
    dishes2TextField.setPreferredSize(new Dimension(400, 20));

    //Display window
    setSize(800,600);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

我得到了这个布局

generated image

布局可能不是您想要的,但我希望您可以继续使用此示例。 ;)


1
投票

考虑将设计分解为更小,更容易布局的容器。 它提供了清晰简单的代码,并允许高度灵活性:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Window extends JFrame {

    public Window() {

        Container panel = this.getContentPane(); //uses Borderlayout by default

        JPanel buttonsPane = new JPanel(new GridLayout(1, 0));
        JButton ordersButton = new JButton("Orders");
        buttonsPane.add(ordersButton);
        JButton dishesButton = new JButton("Dishes");
        buttonsPane.add(dishesButton);
        JButton ingredientsButton = new JButton("Ingredients");
        buttonsPane.add(ingredientsButton);
        JButton suppliersButton = new JButton("Suppliers");
        buttonsPane.add(suppliersButton);
        JButton staffButton = new JButton("Staff");
        buttonsPane.add(staffButton);
        JButton dronesButton = new JButton("Drones");
        buttonsPane.add(dronesButton);
        JButton usersButton = new JButton("Users");
        buttonsPane.add(usersButton);
        JButton postcodesButton = new JButton("Postcodes");
        buttonsPane.add(postcodesButton);
        JButton configurationButton = new JButton("Configuration");
        buttonsPane.add(configurationButton);
        panel.add(buttonsPane, BorderLayout.PAGE_START); //add to top

        JTextField viewScreen = new JTextField();
        viewScreen.setPreferredSize(new Dimension(650, 200));
        panel.add(viewScreen, BorderLayout.CENTER); //add to center

        JPanel ordersList = new JPanel();
        ordersList.setLayout(new BoxLayout(ordersList, BoxLayout.Y_AXIS));

        JPanel ordersPanel = new JPanel(); //uses FlowLayout by default
        ordersList.add(ordersPanel);
        JLabel orders1Label = new JLabel("order 1");
        ordersPanel.add(orders1Label);
        JTextField orders1TextField = new JTextField(50);
        ordersPanel.add(orders1TextField);

        JPanel ordersPanel1 = new JPanel();
        ordersList.add(ordersPanel1);
        JLabel orders2Label = new JLabel("order 2");
        ordersPanel1.add(orders2Label);
        JTextField orders2TextField = new JTextField(50);
        ordersPanel1.add(orders2TextField);

        JPanel dishesList = new JPanel();
        dishesList.setLayout(new BoxLayout(dishesList, BoxLayout.Y_AXIS));

        JPanel dishesPanel = new JPanel();
        dishesList.add(dishesPanel);
        JLabel dishes1Label = new JLabel("dish 1");
        dishesPanel.add(dishes1Label);
        JTextField dishes1TextField = new JTextField(50);
        dishesPanel.add(dishes1TextField);

        JPanel dishesPanel1 = new JPanel();
        dishesList.add(dishesPanel1);
        JLabel dishes2Label = new JLabel("dish 2");
        dishesPanel1.add(dishes2Label);
        JTextField dishes2TextField = new JTextField(50);
        dishesPanel1.add(dishes2TextField);

        JPanel entryFields = new JPanel();
        CardLayout c1 = new CardLayout();
        entryFields.setLayout(c1);

        entryFields.add("ordersPanel",ordersList);
        entryFields.add("dishesPanel", dishesList);
        c1.show(entryFields, "ordersPanel");
        panel.add(entryFields,BorderLayout.PAGE_END);

        ordersButton.addActionListener(arg0 -> c1.show(entryFields, "ordersPanel"));
        dishesButton.addActionListener(arg0 -> c1.show(entryFields, "dishesPanel"));

        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);

    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(()->new Window());
    }
}

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.