Java 使用JPanels设置布局

Java 使用JPanels设置布局,java,swing,jframe,jpanel,null-layout-manager,Java,Swing,Jframe,Jpanel,Null Layout Manager,我在Java中根本没有使用Swing。我正在用它做实验。我想做一个不能改变大小的布局。我看到很多建议使用layoutmanagers将多个jpanel添加到JFrame 然而,我看到的所有涉及布局管理器的教程都说,它允许用户调整屏幕大小。我想要的布局有一个沿着左手边的矩形,一个沿着底部的薄矩形,第三个矩形占据了剩余的空间。我尝试使用绝对布局,但它不想为我工作 import java.awt.Color; import javax.swing.JFrame; import javax.swing

我在Java中根本没有使用Swing。我正在用它做实验。我想做一个不能改变大小的布局。我看到很多建议使用
layoutmanagers
将多个
jpanel
添加到
JFrame

然而,我看到的所有涉及布局管理器的教程都说,它允许用户调整屏幕大小。我想要的布局有一个沿着左手边的矩形,一个沿着底部的薄矩形,第三个矩形占据了剩余的空间。我尝试使用绝对布局,但它不想为我工作

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class Test extends JFrame {

    public Test() {
        JPanel rect1 = new JPanel();
        rect1.setBounds(101, 650, 900, 50);
        rect1.setBackground(Color.RED);
        getContentPane().add(rect1);

        JPanel rect2 = new JPanel();
        rect2.setBounds(0, 650, 100, 1000);
        rect2.setBackground(Color.BLUE);
        getContentPane().add(rect2);

        JPanel rect3 = new JPanel();
        rect3.setBounds(101, 700, 900, 950);
        rect3.setBackground(Color.GREEN);
        getContentPane().add(rect3);

       setTitle("TEST");
       setSize(1000, 700);

       setLocationRelativeTo(null);
       setDefaultCloseOperation(EXIT_ON_CLOSE);        
    }


    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test ex = new Test();
                ex.setVisible(true);
            }
        });
    }
}
有人能帮我在这个布局的Jframe中正确地制作三个JPanel吗(都有不同的颜色)?

您可以使用setResizeable()。请参考下面的代码片段

   setResizable(false); // this will not allow resizing
   setLocationRelativeTo(null);
   setDefaultCloseOperation(EXIT_ON_CLOSE);  

AbsoluteLayout
是不可能的。不要那样做。您可能正在查找
BorderLayout
。查看教程:了解详细信息。如果您不希望您的
JFrame
能够重新调整大小,请使用
frame.setresizeable(false)在它上面。

使用
边框布局作为基础,甚至
网格布局
也可以实现同样的效果

您缺少的主要内容是布局管理器使用(或可以根据布局管理器使用)组件的首选/最小/最大尺寸

基本上,您要做的是定义一个自定义组件(从像
JPanel
这样的东西扩展)并覆盖它的
getPreferredSize
方法并返回所需的值。根据布局管理器的不同,您可能还需要覆盖
getMaximumSize
getMinimumSize
方法

例如

基本上,这显示了“默认”大小以及调整屏幕大小时发生的情况

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FixedSizeLayout {

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

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

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

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;

            add(new ContentPane(), gbc);
            gbc.gridx++;
            add(new LeftPane(), gbc);
            gbc.gridwidth = 2;
            gbc.gridx = 0;
            gbc.gridy = 1;
            add(new BottomPane(), gbc);

        }

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

    }

    public class ContentPane extends JPanel {

        public ContentPane() {
            setBackground(Color.GREEN);
        }

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

        @Override
        public Dimension getMinimumSize() {
            return getPreferredSize();
        }

        @Override
        public Dimension getMaximumSize() {
            return getPreferredSize();
        }

    }

    public class BottomPane extends JPanel {

        public BottomPane() {
            setBackground(Color.RED);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 50);
        }

        @Override
        public Dimension getMinimumSize() {
            return getPreferredSize();
        }

        @Override
        public Dimension getMaximumSize() {
            return getPreferredSize();
        }

    }

    public class LeftPane extends JPanel {

        public LeftPane() {
            setBackground(Color.BLUE);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(50, 150);
        }

        @Override
        public Dimension getMinimumSize() {
            return getPreferredSize();
        }

        @Override
        public Dimension getMaximumSize() {
            return getPreferredSize();
        }

    }
}


现在,如果你愿意的话,你可以让屏幕不可调整大小,但我不喜欢你。我更喜欢使用版面管理器的功能,允许用户决定如何查看内容。。。在那里我可以。。。但这只是我的问题(我不喜欢不可调整大小的窗口,除了某些对话框)

只需使用简单的
BorderLayout
即可自动调整大小:

JPanel panel = new JPanel(new BorderLayout());
panel.add(greenPanel, BorderLayout.CENTER);
panel.add(redPanel, BorderLayout.SOUTH);
panel.add(bluePanel, BorderLayout.EAST);

您可以使用MigLayout并将BorderLayout.CENTER替换为“停靠中心”:


在此处阅读有关MigLayout的更多信息:

回答我1个问题。你什么时候睡觉?现在,我真的很难过,因为我不能把问题贴出来,这样我就可以投票接受答案了P.无论如何,接受挑战。:)@sage会一如既往地提供高质量的答案;)
JPanel panel = new JPanel(new MigLayout(" insets 0"));
panel.add(greenPanel, "dock center");
panel.add(redPanel, "dock south");
panel.add(bluePanel, "dock east");