2

我在 Java 中根本没有真正使用过 Swing。我正在试验它。我想做一个不能改变大小的布局。我已经看到很多建议使用Layout managers将多个添加JPanelsJFrame.

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

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(都具有不同的颜色)吗?

4

5 回答 5

4

您也许可以使用 aBorderLayout作为基础甚至是GridBagLayout.

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

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

例如...

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

在此处输入图像描述在此处输入图像描述

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

    }
}

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

于 2013-10-31T03:19:58.807 回答
3

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

   setResizable(false); // this will not allow resizing
   setLocationRelativeTo(null);
   setDefaultCloseOperation(EXIT_ON_CLOSE);  
于 2013-10-31T03:17:26.513 回答
1

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

于 2013-10-31T03:19:28.860 回答
0

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

JPanel panel = new JPanel(new MigLayout(" insets 0"));
panel.add(greenPanel, "dock center");
panel.add(redPanel, "dock south");
panel.add(bluePanel, "dock east");

在此处阅读有关 MigLayout 的更多信息:http: //www.miglayout.com/QuickStart.pdf

于 2019-01-02T18:19:32.447 回答
0

只需使用简单BorderLayout,它会自动调整大小:

JPanel panel = new JPanel(new BorderLayout());
panel.add(greenPanel, BorderLayout.CENTER);
panel.add(redPanel, BorderLayout.SOUTH);
panel.add(bluePanel, BorderLayout.EAST);
于 2019-01-02T16:19:41.847 回答