java - 使用 JPanels 设置布局

标签 java swing jframe jpanel null-layout-manager

我还没有真正使用过 Java 中的 Swing。我正在试验它。我想制作一个尺寸无法更改的固定布局。我看到很多建议使用 Layout managers 将多个 JPanels 添加到 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(所有颜色都不同)?

最佳答案

您可以使用 BorderLayout 作为基础甚至 GridBagLayout 来实现相同的目的。

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

基本上,您要做的是定义一个自定义组件(从类似 JPanel 的东西扩展)并覆盖它的 getPreferredSize 方法并返回您需要的必需值。根据布局管理器,您可能还需要覆盖 getMaximumSizegetMinimumSize 方法。

例如……

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

enter image description here enter image description here

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

    }
}

现在,如果您愿意,可以使屏幕不可调整大小,但我个人不会喜欢您。我更喜欢使用布局管理器的强大功能,并允许用户决定他们如何查看内容......我可以......但那只是我(我不喜欢不可调整大小的窗口,除了在一些对话的情况)

关于java - 使用 JPanels 设置布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19697832/

相关文章:

java - 如何获取java中同一包中另一个类中一个类中的一个函数生成的数据

java - 错误找不到符号变量 ID

Java 扫雷 GUI

java - 无法更改 BorderLayout 中 block 的大小

Java:仅删除标题栏按钮

java - 使用 JFrame 的浏览器

java - 嵌套的泛型参数作为方法参数 - Java

java - 我可以使这个功能更有效吗(欧拉计划 9)?

java - 保持 JScrollPane 与 java 长度相同

java - 从 jframe 发送到 java 类,然后从其他 jframe 访问它们