在 GridBagLayout 中以固定宽度在 JPanel 上显示 JLabel
Display JLabels on a JPanel with fixed width in GridBagLayout
我想显示一个带有两个 JPanel 的 JFrame。为简单起见,我在 JFrame 的右半部分实现了一个 "placeholder" JPanel。
我想实现在 JFrame 的左侧显示一个 JPanel,即
a) 水平方向不可调整大小(它应该有固定的宽度)。
b) 左侧JPanel的class应该有一种方法可以将JLabel尽可能放在JPanel上(第一个JLabel尽可能远,第二个JLabel在第一个JLabel下,第三个JLabel在第二个下面等等),最好在左侧 JPanel 的中央。
我的代码是:
public class Test extends JPanel {
public Test() {
this.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
this.setBackground(Color.WHITE);
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.weighty = 0;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200,200);
}
public void addEntry() {
JLabel label = new JLabel();
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.weighty = 1;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
label.setText("Label test");
this.add(label, gbc);
this.validate();
}
}
.
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout(2,1));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Test test = new Test();
JPanel placeholder = new JPanel();
placeholder.setPreferredSize(new Dimension(200,200));
placeholder.setBackground(Color.BLACK);
frame.add(test, BorderLayout.LINE_START);
frame.add(placeholder, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
test.addEntry();
test.addEntry();
}
状态:
目前左侧的 JPanel 具有预期的固定宽度,但 JLabel 是在 JPanel 的垂直方向上添加的,也没有放置在 JPanel 的中心。
截图:
编辑:
使用 mKorbel 的建议尝试 BoxLayout:
public class Test extends JPanel {
public Test() {
this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200,200);
}
public void addEntry() {
JLabel label = new JLabel();
label.setText("Label test");
label.setAlignmentX(Component.CENTER_ALIGNMENT);
this.add(label);
this.revalidate();
}
}
您的 addEntry() 方法使用相同的约束,因此您不会获得想要的结果。
您需要创建一个实例变量,比方说 "row",它的初始值设置为 0。然后您将组件添加到面板,x 值为 0,y 值为 "row"。在该方法的末尾,您将 row 增加 1,以便下次调用该方法时,y 值将为 1,这将为您提供垂直布局。
或者另一种选择是使用垂直 BoxLayout。那么您无需担心网格位置。每次添加组件时,它都会垂直添加。阅读有关 How to Use Box Layout 的 Swing 教程部分,了解更多信息和示例。
我想显示一个带有两个 JPanel 的 JFrame。为简单起见,我在 JFrame 的右半部分实现了一个 "placeholder" JPanel。 我想实现在 JFrame 的左侧显示一个 JPanel,即
a) 水平方向不可调整大小(它应该有固定的宽度)。
b) 左侧JPanel的class应该有一种方法可以将JLabel尽可能放在JPanel上(第一个JLabel尽可能远,第二个JLabel在第一个JLabel下,第三个JLabel在第二个下面等等),最好在左侧 JPanel 的中央。
我的代码是:
public class Test extends JPanel {
public Test() {
this.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
this.setBackground(Color.WHITE);
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.weighty = 0;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200,200);
}
public void addEntry() {
JLabel label = new JLabel();
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.weighty = 1;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
label.setText("Label test");
this.add(label, gbc);
this.validate();
}
}
.
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout(2,1));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Test test = new Test();
JPanel placeholder = new JPanel();
placeholder.setPreferredSize(new Dimension(200,200));
placeholder.setBackground(Color.BLACK);
frame.add(test, BorderLayout.LINE_START);
frame.add(placeholder, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
test.addEntry();
test.addEntry();
}
状态:
目前左侧的 JPanel 具有预期的固定宽度,但 JLabel 是在 JPanel 的垂直方向上添加的,也没有放置在 JPanel 的中心。
截图:
编辑: 使用 mKorbel 的建议尝试 BoxLayout:
public class Test extends JPanel {
public Test() {
this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200,200);
}
public void addEntry() {
JLabel label = new JLabel();
label.setText("Label test");
label.setAlignmentX(Component.CENTER_ALIGNMENT);
this.add(label);
this.revalidate();
}
}
您的 addEntry() 方法使用相同的约束,因此您不会获得想要的结果。
您需要创建一个实例变量,比方说 "row",它的初始值设置为 0。然后您将组件添加到面板,x 值为 0,y 值为 "row"。在该方法的末尾,您将 row 增加 1,以便下次调用该方法时,y 值将为 1,这将为您提供垂直布局。
或者另一种选择是使用垂直 BoxLayout。那么您无需担心网格位置。每次添加组件时,它都会垂直添加。阅读有关 How to Use Box Layout 的 Swing 教程部分,了解更多信息和示例。