Java 嵌套布局
Java nested layouts
嗨,我正在尝试创建一个 window 布局如下图所示:
我的 ide 是使用类似这样的面板和嵌套布局:
到目前为止,这是我的代码,但它不能正常工作。我应该怎么做,我应该做些什么不同,甚至我的基本概念是错误的?
package layout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.*;
import models.People;
public class DetailWindow extends JFrame{
public DetailWindow(People newPeople) {
JFrame frame = new JFrame("Detail Window");
JPanel mainPanel = new JPanel(new GridLayout(1,2));
frame.add(mainPanel);
JPanel leftPanel = new JPanel(new GridLayout(2,1));
frame.add(leftPanel);
JPanel rightPanel = new JPanel(new GridLayout(3,1));
frame.add(rightPanel);
JPanel pictureHolder = new JPanel(new FlowLayout());
pictureHolder.add(new JLabel(new ImageIcon(newPeople.getPic())));
leftPanel.add(pictureHolder);
JPanel infoHolder = new JPanel(new GridLayout(6,1));
infoHolder.add(new JTextField(newPeople.getLb_name()));
infoHolder.add(new JTextField(newPeople.getName()));
infoHolder.add(new JTextField(newPeople.getLb_occup()));
infoHolder.add(new JTextField(newPeople.getOccup()));
infoHolder.add(new JTextField(newPeople.getLb_BD()));
infoHolder.add(new JTextField(newPeople.getBD()));
leftPanel.add(infoHolder);
rightPanel.add(new JTextField(newPeople.getName()));
rightPanel.add(new JTextField(newPeople.getOccup()));
rightPanel.add(new JTextField(newPeople.getDetail()));
frame.pack();
frame.setSize(600, 400);
frame.setLocationRelativeTo(null); // Center the frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.show();
}
}
(People 是自定义的 class,主要是我只调用 DetailWindow 构造函数)
提前感谢您的帮助!
如果右侧始终有两短一长文本,请对右侧面板使用 BorderLayout。将大文本添加为 BorderLayout.CENTER,并为顶部的两个较短文本再制作一个面板(可以是 GridLayout)。将第二个面板添加为 BorderLayout.NORTH.
BorderLayout 将一个大组件放在中心,另外四个放在边缘。 GridLayout 就像一个 table 并为所有组件提供相等的 space,这不是你试图实现的。
如果您需要垂直放置多个组件,每个组件仅占用所需的 space,则需要按照要求使用 BoxLayout here。
通过查看您的图片,我会按照说明使用 GridBagLayout here。
这样做的原因是,GridBagLayout 是处理多个面板时最简单的布局,它在与基本矩阵相同的基础上工作,以定位您的 UI 元素,使它们完美 space您可以只使用 spacer,即面板之间具有固定大小的空布局。
另一方面,那里有很多出色的 ide`,我更喜欢 IntelliJ idea,它有一个超级 UI 'generator' 和允许您 space 您的 UI 完全按照您想要的方式。
祝你好运:)
嗨,我正在尝试创建一个 window 布局如下图所示:
我的 ide 是使用类似这样的面板和嵌套布局:
到目前为止,这是我的代码,但它不能正常工作。我应该怎么做,我应该做些什么不同,甚至我的基本概念是错误的?
package layout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.*;
import models.People;
public class DetailWindow extends JFrame{
public DetailWindow(People newPeople) {
JFrame frame = new JFrame("Detail Window");
JPanel mainPanel = new JPanel(new GridLayout(1,2));
frame.add(mainPanel);
JPanel leftPanel = new JPanel(new GridLayout(2,1));
frame.add(leftPanel);
JPanel rightPanel = new JPanel(new GridLayout(3,1));
frame.add(rightPanel);
JPanel pictureHolder = new JPanel(new FlowLayout());
pictureHolder.add(new JLabel(new ImageIcon(newPeople.getPic())));
leftPanel.add(pictureHolder);
JPanel infoHolder = new JPanel(new GridLayout(6,1));
infoHolder.add(new JTextField(newPeople.getLb_name()));
infoHolder.add(new JTextField(newPeople.getName()));
infoHolder.add(new JTextField(newPeople.getLb_occup()));
infoHolder.add(new JTextField(newPeople.getOccup()));
infoHolder.add(new JTextField(newPeople.getLb_BD()));
infoHolder.add(new JTextField(newPeople.getBD()));
leftPanel.add(infoHolder);
rightPanel.add(new JTextField(newPeople.getName()));
rightPanel.add(new JTextField(newPeople.getOccup()));
rightPanel.add(new JTextField(newPeople.getDetail()));
frame.pack();
frame.setSize(600, 400);
frame.setLocationRelativeTo(null); // Center the frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.show();
}
}
(People 是自定义的 class,主要是我只调用 DetailWindow 构造函数)
提前感谢您的帮助!
如果右侧始终有两短一长文本,请对右侧面板使用 BorderLayout。将大文本添加为 BorderLayout.CENTER,并为顶部的两个较短文本再制作一个面板(可以是 GridLayout)。将第二个面板添加为 BorderLayout.NORTH.
BorderLayout 将一个大组件放在中心,另外四个放在边缘。 GridLayout 就像一个 table 并为所有组件提供相等的 space,这不是你试图实现的。
如果您需要垂直放置多个组件,每个组件仅占用所需的 space,则需要按照要求使用 BoxLayout here。
通过查看您的图片,我会按照说明使用 GridBagLayout here。
这样做的原因是,GridBagLayout 是处理多个面板时最简单的布局,它在与基本矩阵相同的基础上工作,以定位您的 UI 元素,使它们完美 space您可以只使用 spacer,即面板之间具有固定大小的空布局。
另一方面,那里有很多出色的 ide`,我更喜欢 IntelliJ idea,它有一个超级 UI 'generator' 和允许您 space 您的 UI 完全按照您想要的方式。
祝你好运:)