Java 一个JFrame中的两个JPanel

Java 一个JFrame中的两个JPanel,java,swing,jpanel,Java,Swing,Jpanel,我想在一个JFrame中使用两个JPanel,它们之间有一条不可见的水平线。我玩了一点,得到了这个: public class Application { public static void main(String[] args) { JFrame jframe = new JFrame(); jframe.setSize(500,700); jframe.setVisible(true); j

我想在一个JFrame中使用两个JPanel,它们之间有一条不可见的水平线。我玩了一点,得到了这个:

public class Application { 

    public static void main(String[] args)
    {   

         JFrame jframe = new JFrame();
         jframe.setSize(500,700);
         jframe.setVisible(true);
         jframe.setTitle("Title");
         jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         jframe.setResizable(false);


         JSplitPane splitPane = new JSplitPane();
         JPanel leftPanel = new JPanel();
         JPanel rightPanel = new JPanel();
         splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);  
         splitPane.setDividerLocation(250);                    
         splitPane.setLeftComponent(leftPanel);                  
         splitPane.setRightComponent(rightPanel); 
         jframe.add(splitPane);


    }
}
现在,第一个问题是如何关闭面板之间线条的“可调整大小”?我如何让它“隐形”?也许可以使用其他东西而不是分割窗格

其次,如何仅使用
JPanel
的一面? (我正在开发一个应用程序,它可以让你在左手边画一个圆)


这似乎是一个简单的问题,但我对Java还比较陌生。

看起来您可以使用GridLayout来完成这项工作。这是我的想法

public class Application {
    public static void main(String[] args) {

        JFrame jframe = new JFrame();
        jframe.setTitle("Title");
        jframe.setResizable(false);

        //This creates one row and two equally divided columns
        GridLayout gridLayout = new GridLayout(0, 2);
        jframe.setLayout(gridLayout);
        gridLayout.layoutContainer(jframe);

        JPanel leftPanel = new JPanel();
        leftPanel.add(new Label("Left side"));
        jframe.add(leftPanel);

        JPanel rightPanel = new JPanel();
        rightPanel.add(new Label("Right side"));
        jframe.add(rightPanel);

        jframe.setSize(800, 500);
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}
下面是它的外观:


面板不会调整大小,也不会有可见的线条分隔它们。

看起来您可以使用GridLayout来完成此操作。这是我的想法

public class Application {
    public static void main(String[] args) {

        JFrame jframe = new JFrame();
        jframe.setTitle("Title");
        jframe.setResizable(false);

        //This creates one row and two equally divided columns
        GridLayout gridLayout = new GridLayout(0, 2);
        jframe.setLayout(gridLayout);
        gridLayout.layoutContainer(jframe);

        JPanel leftPanel = new JPanel();
        leftPanel.add(new Label("Left side"));
        jframe.add(leftPanel);

        JPanel rightPanel = new JPanel();
        rightPanel.add(new Label("Right side"));
        jframe.add(rightPanel);

        jframe.setSize(800, 500);
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}
下面是它的外观:

面板将不会调整尺寸,也不会有可见的线将它们分开。

正如前面所说的,在“MadProgrammer”中,你可以使用,但是当你将“分割”线放在两个面板的中间时,无论窗口大小如何调整,都可以使这两个面板具有相同的大小。

我没有尝试使用
GridBagLayout
,但我做了一个示例,说明如何在不使用
JSplitPane
的情况下实现此窗格分离

使用
GridLayout
时,只需将元素添加到左窗格(在我的示例中,我使用
JLabel
来区分它们),而在
BorderLayout
中,您需要指定将绘制圆的面板向左对齐(
WEST
常量)

但是,如果您使用
BorderLayout
方法并将文本或元素添加到右侧窗格中,它们将向右对齐,您可以通过使用不同的样式“装箱”另一个窗格中的元素来解决此问题

在本例中,我没有调用
pack()
,因为在本例中,两个面板(或
JLabel
s)的大小不够高,无法显示差异:

使用
pack()

调用
setSize()


附加提示
  • 别忘了将您的程序放在上,我是通过在
    main
    方法中写入以下行来实现的:

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Application().createAndShowGui();
        }
    });
    
  • 不要将所有代码都放在构造函数上,否则很难维护

  • 正如前面提到的,在“MadProgrammer”中,你可以使用,但是当你将“分割”线放在两个面板的中间时,你可以使用这两个面板,无论窗口大小是否改变,都可以使两个面板具有相同的大小。 我没有尝试使用

    GridBagLayout
    ,但我做了一个示例,说明如何在不使用
    JSplitPane
    的情况下实现此窗格分离

    使用
    GridLayout
    时,只需将元素添加到左窗格(在我的示例中,我使用
    JLabel
    来区分它们),而在
    BorderLayout
    中,您需要指定将绘制圆的面板向左对齐(
    WEST
    常量)

    但是,如果您使用
    BorderLayout
    方法并将文本或元素添加到右侧窗格中,它们将向右对齐,您可以通过使用不同的样式“装箱”另一个窗格中的元素来解决此问题

    在本例中,我没有调用
    pack()
    ,因为在本例中,两个面板(或
    JLabel
    s)的大小不够高,无法显示差异:

    使用
    pack()

    调用
    setSize()


    附加提示
  • 别忘了将您的程序放在上,我是通过在
    main
    方法中写入以下行来实现的:

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Application().createAndShowGui();
        }
    });
    
  • 不要将所有代码都放在构造函数上,否则很难维护


  • 使用
    GridBagLayout
    BorderLayout
    代替使用
    GridBagLayout
    BorderLayout
    代替谢谢,这就是我一直在寻找的。但这项任务似乎不像我想象的那么简单。我现在如何处理左侧?我有一个类DrawCircle,可以用鼠标单击来画一个圆。leftPanel.add(c)不起作用。@MassU:请理解此答案中的一些代码不符合Swing最佳实践,包括在组件上调用
    setSize(…)
    ,以及调用
    setVisible(true)在将所有组件添加到GUI之前,在JFrase>上,可以阻止一些组件的显示。请强烈考虑Frk酷的答案。当然,同意@气垫船充满鳗鱼。我的代码不遵循最佳格式。我没有编辑MasSU的代码。谢谢,这正是我正在寻找的。但是看来这项任务不是。和我想的一样简单。我现在如何使用左边?我有一个类DrawCircle,在这个类中,人们可以用鼠标单击来画一个圆。leftPanel.add(c)不起作用。@MassU:请理解,这个答案有一些代码不符合Swing最佳实践,包括调用
    setSize(…)
    在组件上,同时调用
    setVisible(true)在将所有组件添加到GUI之前,请在JFrice上添加一些可以防止某些组件显示的东西。请强烈考虑Frk酷的答案。当然,同意@气垫船充满鳗鱼。我的代码没有遵循最佳格式。我没有编辑MasSU的代码。我的钱在这个答案上,非常感谢。但是现在我的应用程序eems相当麻烦。要么根本不显示圆圈,要么在完全不同的位置(以及在整个画面上)显示圆圈。我用新类编辑了我的帖子。@MassU这个问题是关于如何将两个JPanel放在同一个JFrame上的,这个问题在这个答案中得到了回答。请用你的新代码问另一个问题,以及你遇到的问题。另外,别忘了接受答案。我的钱在这个答案上哇,非常感谢。但是现在我的应用程序看起来非常有用四轮马车。两个圆圈都不显示