【问题标题】:Swing GridBagLayout component resizingSwing GridBagLayout 组件调整大小
【发布时间】:2013-06-16 11:14:03
【问题描述】:

我正在做一个项目,我的目标是根据窗口的大小调整组件的大小。我为此使用GridBagLayout,但是在调整窗口大小时调整组件大小时遇到​​了一些问题。当我给我的组件weighty 值时,一切都很好,组件垂直调整大小。 http://imageshack.us/a/img211/9682/d8au.png 但是当我分配weightx 值时,一切都搞砸了。按钮的大小会发生变化,标签之间会出现一些间隙。 http://imageshack.us/a/img12/6946/ij4.png

我没有将weightxweighty 值分配给所有组件,只分配我需要的那些。我不编写 GUI 代码,我只是拖放组件,所以没有代码。我只需要一些有关如何解决此问题的建议,以便组件正确调整大小。我想,这是因为weightx,但我不知道如何让一切正常工作。

【问题讨论】:

  • 我建议先将 UI 分解成几秒钟,然后独立地布置每个部分。权重被列中的其他组件弄糊涂了

标签: java swing user-interface


【解决方案1】:

正如我在评论中建议的那样,并且 Hovercraft 已经建议了这一点,我建议您将 UI 分解为多个部分,分别关注每个部分的布局要求,否则您会发现您为一个组件做出的决定会对他人产生不利影响。

我还建议避免使用 GUI 设计人员,直到您对布局的实际作用有合理的了解并手动编写布局代码。不要误会我的意思,我一直使用 Netbeans 表单设计器,但我也手动调整了许多 UI,尤其是当您需要生成动态和不断变化的 UI 时

以下内容演示了我在说什么。我已经使用LineBorder 突出显示了 UI 的每个部分以使其经受住它。

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;
        }
    }
}

【讨论】:

    【解决方案2】:

    首先,不要像本网站所建议的那样使用空布局。使用空布局通常是 Swing 新手建议的解决方案,因为从表面上看,最初它更容易使用,但后来你发现它的所有问题,包括丑陋或无法运行的 GUI尝试在不同平台上运行应用程序时,如果想要修改 GUI 中的任何内容,则涉及极大的困难,因为这需要手动修改修改后组件右侧或下方的所有其他组件。使用布局管理器的美妙之处在于它可以让他们为您完成繁重的工作,让维护和升级变得轻而易举。

    我建议使用嵌套布局嵌套 JPanel。例如,计算器按钮表现为固定网格,因此在底部没有按钮的地方使用带有 JLabel 占位符的 GridLayout。

    如果需要,外部 GUI JPanel 可以是 GridBagLayout,或者您可以轻松混合其他更简单的布局。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2020-09-13
      • 2011-04-29
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      相关资源
      最近更新 更多