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

Posted

技术标签:

【中文标题】如何在borderlayout北区放置两个Jpanels/Jbuttons?【英文标题】:How do I put two Jpanels/Jbuttons in the borderlayout north section? 【发布时间】:2021-02-02 09:08:43 【问题描述】:

如何在borderlayout的'North'中显示两个JPanel?

以下是输出 GUI 的示例代码,该 GUI 具有三个不同的行,Top、Middle、Bottom。第一行有一个按钮,第二行有 3 个按钮,最后一行有一个。

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

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

【问题讨论】:

北段只能添加一个组件。因此,使该组件成为 JPanel 并将其他组件添加到面板中。您可能希望对该面板使用不同的布局。在具有不同布局的其他面板中使用多个面板是一种常见的 GUI 技术。 您可以将 2 个 JPanel 放在第三个 JPanel 上并添加第三个 JPanel @BUG 谢谢,所以我尝试这样做,但我会为第三个 jpanel 组合使用什么布局?我会使用网格布局吗?我尝试为两个面板做一个边框布局,但它似乎不起作用。然后我将该组合面板添加到另一个面板 但是不鼓励使用setSize()setBounds(),如here 所述 不要使用 setSize() 或 setBounds()!!! Swing 被设计为与布局管理器一起使用。阅读 Layout Managers 上的 Swing 教程,然后确定哪种布局管理器组合适合您。 【参考方案1】:

当您将 GUI 视为 JFrame 和定义 GUI 所需的 JPanels 时,创建更复杂的 GUI 很简单。

这是您要查找的 GUI。

我为JFrame(北、中和南)的每个部分创建了一个JPanelJPanels 中的每一个都使用了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;
    


【讨论】:

以上是关于如何在borderlayout北区放置两个Jpanels/Jbuttons?的主要内容,如果未能解决你的问题,请参考以下文章

10.4 使用布局管理器2(BorderLayout)

缺少 JTextField 并且布局错误地放置了 JButton

java中怎样画出3行3列的、可以填充字符的表格?

在使用add()方法添加组件到容器时,必须指定将其放置在哪个区域中

一个BoxLayout-Row中的2个项目:左边一个,右边一个

BorderLayout.CENTER 上 GridBagLayout 面板的垂直对齐