java - 一个 JFrame 中的两个 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);
         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);


    }
}

现在,第一个问题是如何关闭面板之间线条的“可调整大小”?以及如何让它“不可见”?也许使用分割 Pane 以外的其他东西?

其次,如何才能仅使用 JPanel 的一侧? (我正在开发一个应用程序,可以让您在左侧画一个圆圈)。

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

最佳答案

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

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

使用 GridLayout,您所需要做的就是在 BorderLayout 中将元素添加到左 Pane (在我的示例中,我使用 JLabel 来区分它们) 您需要指定要在其中绘制圆的面板与我一样向左对齐(WEST 常量)。

但是,如果您使用 BorderLayout 方法并向右侧 Pane 添加文本或元素,它们将向右对齐,您可以通过使用不同的方式“装箱”另一个 Pane 中的元素来修复它。 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(),因为两个面板(或本例中的 JLabel)的大小不够高,无法显示差异:

使用pack():

enter image description here

调用setSize():

enter image description here

<小时/>

其他提示

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

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

关于java - 一个 JFrame 中的两个 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41685700/

相关文章:

java - 将 JPanel 添加到 JScrollPane

java - PaintComponent 未绘制到 JPanel 上

java - 框架中应有红色矩形,但什么也看不到

java - 在选项卡 Pane 中显示多个图像

java - 无法通过 db2cmd 连接到 DB2 服务器

java - 定时器的嵌套

java - 在另一个方法中使用时,无法解析 JComponent 名称

java - HBase - 无法抑制 fs 关闭 Hook

Java泛型类型转换

java - 然而球只移动一次