如何对齐 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
包含 titel
和 titelInput
。目前我正在将panel1
的BorderLayout
设置为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。
如果我这样做,面板将彼此并排。我的目标是让一个人低于另一个人。
无视我的评论。在尝试某些操作后,我忘记将 ziel
和 zielImput
添加回 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?
如何使用 GridBagLayout 在 JPanel 中对齐组件中心?