首页 文章

面板在Java中没有使用GridBagLayout正确调整大小

提问于
浏览
3

所以我使用GridBagLayout作为我的GUI,我遇到了一些问题,没有正确调整大小 . 在任何人建议替代布局之前,我很肯定我想使用GridBagLayout;我将拥有大量的组件,我想正确地将它们布局,当前的代码/图像仅显示我现在拥有的内容 .

无论如何,问题是它没有正确调整自身大小 . 我希望它在调整大小时保持当前的宽高比,但事实并非如此 . 某些面板在调整大小时会被赋予某种优先级,这样当我调整大小时,它会破坏纵横比 . 基本上,我有一些面板比另一面板大,但在调整大小后,它变得比另一个小,如下:

http://i.imgur.com/LWhHm.png

现在,我真正想要的是让他们保持已经呈现的比例 . 正如您所看到的,我希望GUI的聊天部分比左侧面板中的任何一个都小,就像它最初一样 .

下面是我现在生成的代码:

jpPack = new JPanel();
    jpCards = new JPanel();
    jpInfo = new JPanel();
    jpChat = new JPanel();


    jpPack.setBackground(Color.red);
    jpCards.setBackground(Color.blue);
    jpInfo.setBackground(Color.green);

    //create the Constraints and set some that will apply to each panel
    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.BOTH;

    //set the number of columns/rows to use
    c.gridwidth = 1;
    c.gridheight = 1;
    //set the x and y position
    c.gridx = 0;
    c.gridy = 0;
    //set the weight properties
    c.weightx = 1.0;
    c.weighty = 1.0;

    getContentPane().add(jpCards, c);

    //set the number of columns/rows to use
    c.gridwidth = 1;
    c.gridheight = 1;
    //set the x and y position
    c.gridx = 0;
    c.gridy = 1;
    //set the weight properties
    c.weightx = 1.0;
    c.weighty = 1.0;

    getContentPane().add(jpPack, c);

    //set the number of columns/rows to use
    c.gridwidth = 1;
    c.gridheight = 1;
    //set the x and y position
    c.gridx = 1;
    c.gridy = 0;
    //set the weight properties
    c.weightx = 0.2;
    c.weighty = 0.2;

    getContentPane().add(jpInfo, c);

    //set the number of columns/rows to use
    c.gridwidth = 1;
    c.gridheight = 1;
    //set the x and y position
    c.gridx = 1;
    c.gridy = 1;
    //set the weight properties
    c.weightx = 0.2;
    c.weighty = 0.2;

    getContentPane().add(jpChat, c);
    jpChat.setLayout(new GridLayout());
    jpChat.add(client.gui.getContentPane(), c);

    setVisible(true);

虽然我很喜欢,但我也可以问我的其他问题 . 我想为整个GUI和聊天面板设置最小大小限制 . 对于第一个,我希望它禁止用户将其大小调整为小于某个x和某个y . 对于后者,我希望它保持我所说的我想要的宽高比,然后在我达到两个右面板的最小值之后调整左侧面板的大小 . 也就是说,它会调整每个面板的大小直到某个尺寸,然后继续调整整个GUI的大小,但只需调整左侧面板的大小,使右侧面板保持最小尺寸 .

谢谢你的帮助 . 这真是让我烦恼,我花了几个小时试图做到这一点,乱搞GridBagLayoutConstraints并没有得到任何地方 . 这是我得到的最好的 .

1 回答

  • 3

    我试着对你的问题进行一些工作,我的原因很简单,可能会引起你的担忧 . 您在 ChatPanel 中使用的 JTextField ,在初始化时,必须为其指定列,这可能会导致此类影响 . 从我制作上述代码的方式来看,这件事在任何意义上都没有给我任何奇怪的行为 . 虽然关于你的第二个问题,@ jackopatra,已经给出了一些见解 . 这是我使用的代码:

    import java.awt.*;
    import javax.swing.*;
    
    public class ClientGrid
    {
        private void displayGUI()
        {
            JFrame frame = new JFrame("Client Grid");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JPanel contentPane = new JPanel();
            contentPane.setLayout(new GridBagLayout());
    
            JPanel bluePanel = new JPanel();
            bluePanel.setOpaque(true);
            bluePanel.setBackground(Color.BLUE);
    
            JPanel greenPanel = new JPanel();
            greenPanel.setOpaque(true);
            greenPanel.setBackground(Color.GREEN);
    
            JPanel redPanel = new JPanel();
            redPanel.setOpaque(true);
            redPanel.setBackground(Color.RED);
    
            JPanel chatPanel = new JPanel();
            JTextField chatField = new JTextField();
            chatPanel.setLayout(new BorderLayout(5, 5));
            chatPanel.add(chatField, BorderLayout.PAGE_START);
    
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.anchor = GridBagConstraints.FIRST_LINE_START;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 0.7;
            gbc.weighty = 0.3;
    
            contentPane.add(bluePanel, gbc);
    
            gbc.gridx = 1;
            gbc.weightx = 0.3;
    
            contentPane.add(greenPanel, gbc);
    
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.weightx = 0.7;
            gbc.weighty = 0.7;
    
            contentPane.add(redPanel, gbc);
    
            gbc.gridx = 1;
            gbc.weightx = 0.3;
    
            contentPane.add(chatPanel, gbc);
    
            frame.setContentPane(contentPane);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String... args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    new ClientGrid().displayGUI();
                }
            });
        }
    }
    

相关问题