Swing GridBagLayout 组件调整大小 [英] Swing GridBagLayout component resizing

查看:40
本文介绍了Swing GridBagLayout 组件调整大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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. When I give my components weighty value, everything is fine, the components resize Vertically. http://imageshack.us/a/img211/9682/d8au.png But when I assign the weightx value, everything is being messed up. The buttons change in size, some gaps appear between Labels. http://imageshack.us/a/img12/6946/ij4.png

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

I don't assign the weightx and weighty values to all of the components, only the ones I need. I do not code the GUI, I just drag&drop the components, so there is no code. 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.

推荐答案

正如我在评论中所建议的,并且 Hovercraft 已经建议,我建议将您的 UI 分解为多个部分,重点关注每个部分分开,否则你会发现你为一个组件所做的决定会对其他组件产生不利影响.

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.

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

下面演示了我在说什么.我已经使用 LineBorder 突出显示了 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.

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

这篇关于Swing GridBagLayout 组件调整大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆