有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在调整JFrame的大小时消除了组件之间的额外空间

我正在使用GridBagLayout在一个框架中排列一些组件。
第一次创建框架时,组件之间有一个合适的空间enter image description here

但是,只要我调整框架的大小,组件之间就会有很多不需要的空间 enter image description here

我试着按照一些用户的建议调整权重和插入,但似乎无法解决问题

import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JTextArea;

public class Frame1 extends JFrame {

    JLabel one = new JLabel("one");
    JLabel two = new JLabel("two");
    JLabel three = new JLabel("three");

    JTextField oneF = new JTextField(20);
    JTextField twoF = new JTextField(20);
    JTextField threeF = new JTextField(20);

    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("menu");

    GridBagConstraints c = new GridBagConstraints();

    public Frame1() {
        setTitle("GridBagLayout Test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new GridBagLayout());

        menuBar.add(menu);

        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = c.REMAINDER;
        c.fill = c.HORIZONTAL;
        c.gridheight = 1;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = c.NORTH;
        c.insets = new Insets(5,5,5,5);
        add(menuBar, c);

        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 1;
        c.fill = c.NONE;
        c.gridheight = 1;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = c.NORTH;
        c.insets = new Insets(5,5,5,5);
        add(one, c);

        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 1;
        c.fill = c.NONE;
        c.gridheight = 1;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = c.NORTH;
        c.insets = new Insets(5,5,5,5);
        add(oneF, c);

        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 1;
        c.fill = c.NONE;
        c.gridheight = 1;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = c.NORTH;
        c.insets = new Insets(5,5,5,5);
        add(two, c);

        c.gridx = 1;
        c.gridy = 2;
        c.gridwidth = 1;
        c.fill = c.NONE;
        c.gridheight = 1;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = c.NORTH;
        c.insets = new Insets(5,5,5,5);
        add(twoF, c);

        c.gridx = 0;
        c.gridy = 3;
        c.gridwidth = 1;
        c.fill = c.NONE;
        c.gridheight = 1;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = c.NORTH;
        c.insets = new Insets(5,5,5,5);
        add(three, c);

        c.gridx = 1;
        c.gridy = 3;
        c.gridwidth = 1;
        c.fill = c.NONE;
        c.gridheight = 1;
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = c.NORTH;
        c.insets = new Insets(5,5,5,5);
        add(threeF, c);

       //setResizable(false);
       pack();
       setVisible(true);
    }

}

ps:-我是GUI编程新手,所以请原谅我的任何noob错误

编辑1:这是我完成后想要的。我知道目前它看起来并不接近我的想法。。。我仍在努力enter image description here

谢谢


共 (4) 个答案

  1. # 1 楼答案

    我不知道它应该是什么样子,但是您可以尝试为文本字段设置标签c.anchor=GridBagConstraints.EASTc.anchor=GridBagConstraints.WEST

    还可以尝试设置c.fill = GridBadConstraints.BOTH

  2. # 2 楼答案

    这样做的目的是添加空行/列,以填充可用空间:

    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JTextField;
    
    public class Frame1 extends JFrame {
    
        JLabel one = new JLabel("one");
        JLabel two = new JLabel("two");
        JLabel three = new JLabel("three");
    
        JTextField oneF = new JTextField(20);
        JTextField twoF = new JTextField(20);
        JTextField threeF = new JTextField(20);
    
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("menu");
    
        public Frame1() {
    
            setTitle("GridBagLayout Test");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
    
            GridBagLayout gridBagLayout = new GridBagLayout();
            gridBagLayout.rowHeights = new int[]{0, 0, 0, 0}; //this defines 4 rows
            //make 2 last empty row grow 
            gridBagLayout.rowWeights = new double[]{0.0, 0.0, 1.0,1.0};
    
            //do the same for columns 
            gridBagLayout.columnWidths = new int[]{0, 0, 0, 0};
            gridBagLayout.columnWeights = new double[]{0.0, 0.0, 1.0,1.0};
    
            getContentPane().setLayout(gridBagLayout);
    
            menuBar.add(menu);
    
            GridBagConstraints c = new GridBagConstraints();
            c.gridx = 0;
            c.gridy = 0;
            c.gridwidth = 5;
            c.fill = c.HORIZONTAL;
            c.anchor = c.NORTH;
            c.insets = new Insets(5, 5, 5, 0);
            getContentPane().add(menuBar, c);
    
            //better have a new GridBagConstraints for each component added 
            GridBagConstraints c1 = new GridBagConstraints();
            c1.gridx = 0;
            c1.gridy = 1;
            c1.gridwidth = 1;
            c1.fill = c1.NONE;
            c1.anchor = c1.NORTH;
            c1.insets = new Insets(5, 5, 0, 5);
            getContentPane().add(one, c1);
    
            GridBagConstraints c2 = new GridBagConstraints();
            c2.gridx = 1;
            c2.gridy = 1;
            c2.fill = c2.NONE;
            c2.anchor = GridBagConstraints.NORTHWEST;
            c2.insets = new Insets(5, 5, 0, 5);
            getContentPane().add(oneF, c2);
    
            pack();
            setVisible(true);
        }
    
        public static void main(String[] args) {
            new Frame1();
        }
    }
    

    编辑:响应您的编辑:使用“封面艺术”的附加“成长”栏

  3. # 3 楼答案

    问题是c.weightxc.weighty的赋值。weightx和weighty确定当容器变得比容纳组件的首选尺寸所需的大时,如何将额外空间分配给GridBagLayout中的网格单元

    对于所有单元格,权重x和权重y应为零,但当窗口变大时希望变大的单元格除外

  4. # 4 楼答案

    • 使用嵌套布局(几个LayoutManager的组合),您的图片告诉我,

    • 仍然可以对放置在左侧的组件使用GridBagLayout

    • 在我的代码中(尽可能最简单的想法)JComponent放在左侧的无法调整大小,因为它们受到LayoutManager默认值的限制,更多信息请参见Oracle tutorial

    enter image description here

    enter image description here

    由SSCCE/MCVE涂漆

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class MyFrame {
    
        private static final long serialVersionUID = 1L;
        private JFrame myFrame = new JFrame("Whatever");
        private JPanel parentPanel = new JPanel(new BorderLayout(10, 10)) {
    
            private static final long serialVersionUID = 1L;
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(600, 400);
            }
    
            @Override
            public Color getBackground() {
                return new Color(255, 000, 000);
            }
        };
        private JPanel leftPanel = new JPanel(/*default is FlowLayout*/) {
    
                    private static final long serialVersionUID = 1L;
    
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(300, 400);
                    }
    
                    @Override
                    public Color getBackground() {
                        return new Color(255, 255, 000);
                    }
                };
        private JPanel leftChildPanel = new JPanel() {
    
            private static final long serialVersionUID = 1L;
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 400);
            }
    
            @Override
            public Color getBackground() {
                return new Color(255, 255, 225);
            }
        };
        private JPanel rightPanel = new JPanel(new BorderLayout(10, 10)) {
    
            private static final long serialVersionUID = 1L;
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 380);
            }
    
            @Override
            public Color getBackground() {
                return new Color(000, 255, 225);
            }
        };
    
        public MyFrame() {
            parentPanel.add(leftPanel, BorderLayout.WEST);
            leftPanel.add(leftChildPanel);
            parentPanel.add(rightPanel);
            myFrame.add(parentPanel);
            myFrame.setLocation(150, 150);
            myFrame.pack();
            myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            myFrame.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> {
                new MyFrame();
            });
        }
    }