简体   繁体   English

Swing GridBagLayout组件调整大小

[英]Swing GridBagLayout component resizing

I am working on a project and my goal is to make the components resize according to the size of the window. 我正在开发一个项目,我的目标是根据窗口大小调整组件大小。 I am using GridBagLayout for this, however I am experiencing some problems when making the components resize when the window resizes. 我正在使用GridBagLayout ,但是当窗口调整大小时使组件调整大小时遇到​​一些问题。 When I give my components weighty value, everything is fine, the components resize Vertically. 当我给出我的组件weighty值时,一切都很好,组件垂直调整大小。 http://imageshack.us/a/img211/9682/d8au.png But when I assign the weightx value, everything is being messed up. http://imageshack.us/a/img211/9682/d8au.png但是当我指定weightx值时,一切都搞砸了。 The buttons change in size, some gaps appear between Labels. 按钮的大小会发生变化,标签之间会出现一些间隙。 http://imageshack.us/a/img12/6946/ij4.png http://imageshack.us/a/img12/6946/ij4.png

I don't assign the weightx and weighty values to all of the components, only the ones I need. 我没有为所有组件分配weightxweighty值,只给我需要的组件。 I do not code the GUI, I just drag&drop the components, so there is no code. 我没有编写GUI代码,我只是拖放组件,所以没有代码。 I just need some advice on how to fix this, so that the components are resizing correctly. 我只需要一些关于如何解决这个问题的建议,以便组件正确调整大小。 I suppose, this is because of the weightx , but I don't have an idea on how to make everything work fine. 我想,这是因为weightx ,但我不知道如何使一切正常。

First of all, don't use null layout as one has suggested on this site. 首先,不要像在本网站上建议的那样使用空布局。 Use of null layouts is often a solution suggested by Swing newbies because on the surface and initially, it is easier to use, but then later you discover all the problems with it, including ugly or non-functioning GUI's when trying to run the application on different platforms, and the extreme difficulty involved if wanting to modify anything in the GUI as this requires hand-modification of all other components that are right or below the modified component. 使用null布局通常是Swing新手提出的解决方案,因为从表面上看,它容易使用,但后来你发现它的所有问题,包括在尝试运行应用程序时的丑陋或无法运行的GUI不同的平台,以及如果想要修改GUI中的任何内容所涉及的极端困难,因为这需要手动修改修改后的组件正确或下方的所有其他组件。 The beauty of use of layout managers is it allows them to do the hard work for you, making maintenance and upgrades a breeze. 使用布局管理器的美妙之处在于它允许他们为您完成艰苦的工作,使维护和升级变得轻而易举。

I suggesting nesting JPanels with nested layouts. 我建议使用嵌套布局嵌套JPanels。 The Calculator buttons for example are behaving as a fixed grid, so use a GridLayout for them with JLabel placeholders where there are no buttons at the bottom. 例如,计算器按钮表现为固定网格,因此对于JLabel占位符使用GridLayout,底部没有按钮。

The outer GUI JPanel can be GridBagLayout if desired, or you could easily mix in other easier layouts. 如果需要,外部GUI JPanel可以是GridBagLayout,或者您可以轻松地混合其他更简单的布局。

As I suggested in my comment, and which has already being suggested by Hovercraft, I'd recommend breaking you UI down into sections, focusing on the layout requirements of each section separately, otherwise you will find decisions you make for one component will have adverse effects on others. 正如我在评论中提到的,并且已经被Hovercraft建议,我建议将UI分解为几个部分,分别关注每个部分的布局要求,否则你会发现你为一个部件做出的决定会产生不利影响对他人的影响。

I'd also recommend avoiding GUI designers until you have a reasonable understanding of what the layouts are actually doing and code the layouts by hand. 我还建议避免使用GUI设计器,直到您对布局实际执行的内容有一个合理的理解并手动编写布局。 Don't get me wrong, I use Netbeans form designer all the time, but I also tweak many of my UIs by hand, especially when you need to produce dynamic and changing UIs 不要误会我的意思,我一直使用Netbeans表单设计器,但我也手动调整了很多UI,特别是当你需要生成动态和不断变化的UI时

The following demonstrates what I'm talking about. 以下演示了我在说什么。 I've highlighted each section of the UI with the use a LineBorder to make it stand it. 我已经使用LineBorder突出显示了UI的每个部分,使其保持LineBorder

在此输入图像描述在此输入图像描述

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class BadLayout25 {

    public static void main(String[] args) {
        new BadLayout25();
    }

    public BadLayout25() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BasePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class BasePane extends JPanel {

        public BasePane() {
            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1.0;
            add(getTopPane(), gbc);

            gbc = new java.awt.GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
            gbc.weightx = 0.5;
            add(getOptionsPane(), gbc);

            gbc = new java.awt.GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 2;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.5;
            gbc.weighty = 1.0;
            add(getButtonPane(), gbc);

            JTextArea textArea = new JTextArea(5, 20);

            gbc = new java.awt.GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 1;
            gbc.gridheight = 2;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.5;
            gbc.weighty = 1.0;
            add(new JScrollPane(textArea), gbc);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(800, 400);
        }

        protected JPanel getTopPane() {
            JPanel topPane = new JPanel(new GridBagLayout());
            topPane.setBorder(BorderFactory.createLineBorder(java.awt.Color.RED));
            topPane.add(new JLabel("Lotereya:"));
            topPane.add(new JLabel("Yuklenilir"));
            return topPane;
        }

        protected JPanel getOptionsPane() {
            JPanel optionsPane = new JPanel(new GridBagLayout());
            optionsPane.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 255, 0)));
            GridBagConstraints gbc = new GridBagConstraints();

            gbc = new GridBagConstraints();
            gbc.anchor = java.awt.GridBagConstraints.LINE_START;
            optionsPane.add(new JLabel("Tiraj nomre:"), gbc);

            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.gridwidth = 2;
            gbc.anchor = java.awt.GridBagConstraints.LINE_START;
            optionsPane.add(new JLabel("Sablon nomresi:"), gbc);

            JTextField field = new JTextField(10);
            gbc = new GridBagConstraints();
            gbc.gridx = 2;
            gbc.gridy = 1;
            gbc.anchor = java.awt.GridBagConstraints.LINE_START;
            gbc.weightx = 1.0;
            optionsPane.add(field, gbc);

            JComboBox comboBox = new JComboBox();
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbc.anchor = java.awt.GridBagConstraints.LINE_START;
            gbc.weightx = 1.0;
            optionsPane.add(comboBox, gbc);

            return optionsPane;
        }

        protected JPanel getButtonPane() {
            JPanel buttonsPane = new JPanel(new GridBagLayout());
            buttonsPane.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 255)));

            GridBagConstraints gbc = new GridBagConstraints();
            gbc = new java.awt.GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = -1;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.25;
            gbc.weighty = 0.25;
            for (int index = 0; index < 9; index++) {
                if (index % 3 == 0) {
                    gbc.gridy++;
                    gbc.gridx = 0;
                } else {
                    gbc.gridx++;
                }
                buttonsPane.add(new JButton(String.valueOf(index + 1)), gbc);
            }
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 3;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.25;
            gbc.weighty = 0.25;
            buttonsPane.add(new JButton("0"), gbc);

            gbc = new GridBagConstraints();
            gbc.gridx = 3;
            gbc.gridy = 0;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.25;
            gbc.weighty = 0.25;
            buttonsPane.add(new JButton("Tesdiq"), gbc);
            gbc.gridy++;
            buttonsPane.add(new JButton("<ticket.apply>"), gbc);
            gbc.gridy++;
            buttonsPane.add(new JButton("<ticket.cancel>"), gbc);
            gbc.gridy++;
            buttonsPane.add(new JButton("<main menu>"), gbc);

            return buttonsPane;
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM