有几种不同的命令可以在Java Swing中显式对齐元素。似乎这些命令仅在某些非常特定的约束下工作,并且这些约束在任何地方都没有记录。大多数时候我想对齐元素,这些命令根本不做任何事情。所以我想知道为什么这些命令不能执行文档所说的内容,以及如何在Swing中对齐元素?
作为参考,这里是一个带有OK按钮的SSCCE,当我们明确地将水平对齐设置为居中时,它与左边对齐。
import javax.swing.*;
import java.awt.*;
public class E {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel notificationView = new JPanel();
notificationView.setPreferredSize(new Dimension(300, 145));
notificationView.setLayout(new GridBagLayout());
JPanel content = new JPanel();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
JLabel notificationText = new JLabel("Here is some text to display to the user and below this is an ok button.");
content.add(notificationText);
JButton buttonOkNotification = new JButton("OK");
//buttonOkNotification.setHorizontalAlignment(JLabel.CENTER); // does not do anything
//buttonOkNotification.setAlignmentX(Component.CENTER_ALIGNMENT); // does not do anything
content.add(buttonOkNotification);
notificationView.add(content);
frame.add(notificationView);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
答案 0 :(得分:3)
JButton buttonOkNotification = new JButton("OK");
//buttonOkNotification.setHorizontalAlignment(JLabel.CENTER); // does not do anything
//buttonOkNotification.setAlignmentX(Component.CENTER_ALIGNMENT); // does not do anything
请注意,按钮上调用的方法是对齐按钮的 内容 ,而不是按钮本身。如果组件拉伸得比其优选尺寸大,则这些约束通常只会变得相关或明显。这种拉伸通常是由于它所在的容器的布局和约束。一个很好的例子是BorderLayout
:
PAGE_START
或PAGE_END
。LINE_START
或LINE_END
。CENTER
。与FlowLayout
对比。流布局不会垂直或水平拉伸组件,而是始终将它们保持在首选大小。
要使面板中的按钮组件对齐,必须对布局使用约束。这可以在建筑上完成,例如:
new FlowLayout(FlowLayout.RIGHT); // aligns all child components to the right hand side
但是在将容器添加到容器时更常见。例如。将组件添加到GridBagLayout
时,它可能如下所示:
gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
panel.add(new JLabel("North West"), gridBagConstraints);