如何在borderlayout北区放置两个Jpanels / Jbutton?

问题描述

如何在borderlayout的“北部”中显示两个JPanel?

以下是示例代码,该代码输出具有三个不同行(顶部,中间,底部)的GUI。有一个按钮覆盖第一行,三个按钮覆盖第二行,一个覆盖底部行。

package borderLayoutDemo;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;

public class BorderLayoutDemo {
    public static void main(String[] args) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame fj = new JFrame("Demonstration of Border Layout");
        fj.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        JButton jbtn1 = new JButton("UP");
        JButton jbtn2 = new JButton("DOWN");
        JButton jbtn3 = new JButton("LEFT");
        JButton jbtn4 = new JButton("RIGHT");
        JButton jbtn5 = new JButton("MIDDLE");
        JPanel pnl = new JPanel();
        pnl.setLayout(new BorderLayout());
        pnl.add(jbtn1,BorderLayout.norTH);
        pnl.add(jbtn2,BorderLayout.soUTH);
        pnl.add(jbtn3,BorderLayout.WEST);
        pnl.add(jbtn4,BorderLayout.EAST);
        pnl.add(jbtn5,BorderLayout.CENTER);
        fj.add(pnl);
        fj.pack();
        fj.setVisible(true);
    }
}

以上代码输出output of above code

但是,我希望北段有两个jpanel,这样它就可以做成4个“行”:

|---------------button--------------| //north
|---------------button2-------------| //north
----------------center---------------  //center
|---------------button3-------------|  //south

我尝试仅按如下方式添加它:

pnl.add(jbtn1,BorderLayout.norTH);
pnl.add(jbtn2,BorderLayout.norTH);

但是这里发生的是第二个按钮替换了第一个按钮:

|---------------button2-------------| //north
----------------center---------------  //center
|---------------button3-------------|  //south

如何在北面布局区域获得两行?

很抱歉,如果这个问题很糟糕,我是新手。预先感谢。

解决方法

当您将一个GUI视为一个JFrame且定义该GUI所需的JPanels数量很大时,创建一个更复杂的GUI很简单。

这是您要查找的GUI。

Button GUI

我为JPanel的每个部分(NORTH,CENTER和SOUTH)创建了一个JFrame。每个JPanels都使用BorderLayout,因此,在展开GUI时,NORTH和SOUTH按钮保持相同的高度。

这是完整的可运行示例代码。

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class BorderLayoutDemo implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new BorderLayoutDemo());
    }

    @Override
    public void run() {
        JFrame fj = new JFrame("Demonstration of Border Layout");
        fj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        fj.add(createNorthPanel(),BorderLayout.NORTH);
        fj.add(createCenterPanel(),BorderLayout.CENTER);
        fj.add(createSouthPanel(),BorderLayout.SOUTH);
        
        fj.pack();
        fj.setLocationByPlatform(true);
        fj.setVisible(true);
    }
    
    private JPanel createNorthPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        
        JButton button1 = new JButton("North Button");
        panel.add(button1,BorderLayout.NORTH);
        
        JButton button2 = new JButton("North Button 2");
        panel.add(button2,BorderLayout.SOUTH);
        
        return panel;
    }
    
    private JPanel createCenterPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        
        JButton button = new JButton("Center Button");
        panel.add(button,BorderLayout.CENTER);
        
        return panel;
    }
    
    private JPanel createSouthPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        
        JButton button = new JButton("South Button");
        panel.add(button,BorderLayout.SOUTH);
        
        return panel;
    }

}