如何对齐 JPanel 在另一个 JPanel 下方居中?

Posted

技术标签:

【中文标题】如何对齐 JPanel 在另一个 JPanel 下方居中?【英文标题】:How do I align a JPanel centered underneath another JPanel? 【发布时间】:2021-06-28 09:52:31 【问题描述】:

你好

我正在处理以下 GUI。

import javax.swing.*;
import java.awt.*;

public class gui
    public static void main(String[] args) 
        //Neues Fenster mainFrame
        JFrame mainFrame = new JFrame("Lernjournal");

        //Schliessen des Fensters ermöglichen
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //mainFrame Fenstergrösse
        mainFrame.setSize(1280,720);

        //MenuBar erstellen
        JMenuBar menu = new JMenuBar();

        //Dropdown menu erstellen
        JMenu menu1 = new JMenu("Datei");
        JMenuItem neu = new JMenuItem("Neu");
        JMenuItem speichern = new JMenuItem("Speichern");
        JMenuItem eintrag = new JMenuItem("Einträge");

        //Einfügen der Menus
        menu.add(menu1);
        menu1.add(neu);
        menu1.add(speichern);
        menu1.add(eintrag);

        //Neues Panel erstellen
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        //Titel und Textfeld für Titel
        JLabel titel = new JLabel("Titel: ");
        JTextField titelInput = new JTextField(30);

        //Titel und Textfeld für das Ziel
        JLabel ziel = new JLabel("Zielvorstellung: ");
        JTextArea zielInput = new JTextArea(3,30);

        //JPanels dem JFrame hinzufügen
        mainFrame.getContentPane().add(BorderLayout.PAGE_START, menu);
        mainFrame.getContentPane().add(BorderLayout.NORTH, panel1);
        mainFrame.getContentPane().add(BorderLayout.CENTER, panel2);
        panel1.add(titel);
        panel1.add(titelInput);
        panel2.add(ziel);
        panel2.add(zielInput);

        mainFrame.setVisible(true);
    

panel1 包含 titeltitelInput 。目前我正在将panel1BorderLayout 设置为BorderLayout.NORTH,将panel2 设置为BorderLayout.CENTER,以查看是否可以同时看到两者(实际上不是)。

据我所知,panel2 覆盖了panel1,因为即使有两个 JPanel,BorderLayout 始终位于 JFrame 的中心。

我尝试使用FlowLayout,但无法达到预期的结果。

This is the GUI if both BorderLayouts are centered. panel2 covers panel1

我想要实现的是两个 JPanel 都显示在彼此下方。

提前致谢。

编辑

我最终改用 Box.createVerticalBox() 函数并更改了一些小东西。

    import javax.swing.*;
import java.awt.*;
import java.sql.*;


public class gui
    public static void main(String[] args) throws SQLException 

        //Neues Fenster mainFrame
        JFrame mainFrame = new JFrame("Lernjournal");

        //Schliessen des Fensters ermöglichen
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //mainFrame Fenstergrösse
        mainFrame.setSize(1280,720);

        //MenuBar erstellen
        JMenuBar menu = new JMenuBar();

        //Dropdown menu erstellen
        JMenu menu1 = new JMenu("Datei");
        JMenuItem neu = new JMenuItem("Neu");
        JMenuItem eintrag = new JMenuItem("Einträge");

        //Einfügen der Menus
        menu.add(menu1);
        menu1.add(neu);
        menu1.add(eintrag);

        //Neues Panel und neue Box erstellen
        Box box = Box.createVerticalBox();
        JPanel panel1 = new JPanel();
        panel1.add(box);
        
        //Titel und Textfeld für Titel
        JLabel titel = new JLabel("Titel");
        JTextField titelInput = new JTextField(30);

        //Titel und Textfeld für das Ziel
        JLabel ziel = new JLabel("Zielvorstellung");
        JTextArea zielInput = new JTextArea(3,30);

        //JPanels dem JFrame hinzufügen
        mainFrame.setJMenuBar(menu);
        mainFrame.getContentPane().add(BorderLayout.NORTH, panel1);

        //Box füllen
        box.add(titel);
        box.add(titelInput);
        box.add(ziel);
        box.add(zielInput);

        mainFrame.setVisible(true);
    


【问题讨论】:

我不确定所需的布局是什么。要将JPanel 居中在父级中,请使用GridBagLayout 作为父级,没有任何约束。只需new JPanel(new GridBagLayout()) 使用 setJMenuBar 方法将 JMenuBar 添加到 JFrame 菜单栏。然后将您的 JPanel 添加到 NORTH 和 CENTER。 如果我这样做,面板将彼此并排。我的目标是让一个人低于另一个人。 无视我的评论。在尝试某些操作后,我忘记将 zielzielImput 添加回 panel2。你的工作正常,谢谢! @GilbertLeBlanc 您能否将您的答案发布为评论,以便我可以接受它作为解决方案@GilbertLeBlanc? 【参考方案1】:

您的代码中的以下更改可能会为您提供所需的输出。

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import net.miginfocom.swing.MigLayout;

public class gui
  public static void main(String[] args) 
      //Neues Fenster mainFrame
      JFrame mainFrame = new JFrame("Lernjournal");

      //Schliessen des Fensters ermöglichen
      mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      //mainFrame Fenstergrösse
      mainFrame.setSize(1280,720);

      //MenuBar erstellen
      JMenuBar menu = new JMenuBar();

      //Dropdown menu erstellen
      JMenu menu1 = new JMenu("Datei");
      JMenuItem neu = new JMenuItem("Neu");
      JMenuItem speichern = new JMenuItem("Speichern");
      JMenuItem eintrag = new JMenuItem("Einträge");

      //Einfügen der Menus
      menu.add(menu1);
      menu1.add(neu);
      menu1.add(speichern);
      menu1.add(eintrag);

      //Neues Panel erstellen
      JPanel panel1 = new JPanel();
      JPanel panel2 = new JPanel();
      //Titel und Textfeld für Titel
      JLabel titel = new JLabel("Titel: ");
      JTextField titelInput = new JTextField(30);

      //Titel und Textfeld für das Ziel
      JLabel ziel = new JLabel("Zielvorstellung: ");
      JTextArea zielInput = new JTextArea(3,30);

      //JPanels dem JFrame hinzufügen
      //mainFrame.getContentPane().add(BorderLayout.PAGE_START, menu);
      //mainFrame.getContentPane().add(BorderLayout.NORTH, panel1);
      //mainFrame.getContentPane().add(BorderLayout.CENTER, panel2);
      panel1.add(titel);
      panel1.add(titelInput);
      panel2.add(ziel);
      panel2.add(zielInput);
      
      mainFrame.setLayout(new MigLayout());// Set layout

      // Add components
      mainFrame.add(menu, "north, w 100%");
      mainFrame.add(panel1, "center, wrap");
      mainFrame.add(panel2, "center");
      

      mainFrame.setVisible(true);
  

您可以从here下载依赖库(miglayout15-swing.jar)

【讨论】:

有几种方法可以完成这项任务。我也更喜欢您建议的使用“Miglayout”的解决方案。因为 Miglayout 具有在 Java 桌面应用程序中创建熟练的 GUI 表示的功能。【参考方案2】:

这是评论中提供的解决方案

使用 setJMenuBar 方法将 JMenuBar 添加到 JFrame 菜单栏。然后将您的 JPanel 添加到 NORTH 和 CENTER。 ——吉尔伯特·勒布朗

【讨论】:

以上是关于如何对齐 JPanel 在另一个 JPanel 下方居中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个类中的 JPanel 类中实现 ActionListener?

如何在 JPanel 中将所有元素左对齐?

如何使用 GridBagLayout 在 JPanel 中对齐组件中心?

如何将 JLabel 对齐到 JPanel 的左侧?

添加到 BorderLayout 时,无法在 JPanel 中左对齐 JLabel

与 JPanel Swing 中的限制组件对齐