【问题标题】:Two JPanels in one JFrame一个 JFrame 中的两个 JPanel
【发布时间】:2017-01-17 22:07:50
【问题描述】:

我想在一个 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 比较陌生。

【问题讨论】:

  • 改用GridBagLayoutBorderLayout

标签: java swing jpanel


【解决方案1】:

正如之前在@MadProgrammer 的comment 中所说,您可以使用BorderLayoutGridBagLayout,但是当您将“拆分”行放在两个面板的中间时,您可以使用GridLayout,这将无论窗口是否调整大小,都使两个面板的大小相同。

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

使用GridLayout,您需要做的就是将元素添加到左侧窗格(在我的示例中,我使用JLabel 来区分它们),而在BorderLayout 中,您需要指定您将要放置的面板像我一样将圆圈绘制为与左侧对齐(@9​​87654339@ 常量)。

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

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

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

public class Application {

    private JFrame frame;
    private JPanel containerPane;
    private JPanel topPane;
    private JPanel bottomPane;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Application().createAndShowGui();
            }
        });
    }

    public void createAndShowGui() {
        frame = new JFrame("Example of 2 panels");
        containerPane = new JPanel();
        topPane = new JPanel();
        bottomPane = new JPanel();

        containerPane.setLayout(new GridLayout(2, 1));
        topPane.setLayout(new GridLayout(1, 2));
        bottomPane.setLayout(new BorderLayout());

        topPane.add(new JLabel("Left side"));
        topPane.add(new JLabel("Right side"));

        bottomPane.add(new JLabel("Left side"), BorderLayout.WEST);
        bottomPane.add(new JLabel("Right side"), BorderLayout.EAST);

        topPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Using GridLayout"));
        bottomPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Using BorderLayout"));

        containerPane.add(topPane);
        containerPane.add(bottomPane);

        frame.add(containerPane);

//      frame.pack();
        frame.setSize(500, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

在此示例中我没有调用 pack(),因为两个面板的大小(或在本例中为 JLabels 的大小不足以显示差异:

使用pack()

致电setSize():


其他提示

  1. 不要忘记将您的程序放在Event Dispatch Thread (EDT) 上,我通过在main 方法上写下这些行来做到这一点:

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

【讨论】:

  • 我的钱在这个答案上
  • 哇,非常感谢。但现在我的应用程序似乎有很多错误。要么根本不显示圆圈,要么不显示在完全不同的位置(以及在整个框架上)。我用新课程编辑了我的帖子。
  • @MassU 这个问题与如何将两个 JPanel 放在同一个 JFrame 上有关,在这个答案中得到了回答,请用您的新代码和您遇到的问题提出另一个问题。也不要忘记接受答案
【解决方案2】:

看起来您可以使用 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);

    }
}

它的外观如下:

面板不会调整大小,也没有可见的线将它们分开。

【讨论】:

  • 谢谢,这正是我想要的。但似乎这项任务并不像我想象的那么容易。我现在如何使用左侧?我有一个类 DrawCircle,可以在其中通过鼠标单击绘制一个圆。 leftPanel.add(c) 不起作用。
  • @MassU:理解这个答案有一些不遵循 Swing 最佳实践的代码,包括在组件上调用 setSize(...) 以及在 JFrame 之前调用 setVisible(true) 将所有组件添加到 GUI,这可能会阻止某些组件显示。请认真考虑 Frakcool 的回答。
  • 绝对同意@Hovercraft Full Of Eels。我的代码不遵循最佳格式。我没有编辑 MassU 的代码。
猜你喜欢
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2014-04-12
  • 2014-06-05
  • 1970-01-01
  • 2014-01-26
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多