【发布时间】:2009-05-15 18:30:16
【问题描述】:
我目前正在使用 Java Swing 设计一个计算器面板。但是,将所有按钮排成一行是一件极其痛苦的事情,因为每当我添加新按钮或更改按钮大小时,它们总是会调整自己的大小和重新定位。
是否有某种布局或可以将按钮“锁定”到位,以便在我移动/调整大小/添加其他按钮时不受影响?
谢谢, 鲍勃
【问题讨论】:
-
网格布局?网格包布局?我不确定我是否完全理解这个问题;按钮如何移动和改变大小?
我目前正在使用 Java Swing 设计一个计算器面板。但是,将所有按钮排成一行是一件极其痛苦的事情,因为每当我添加新按钮或更改按钮大小时,它们总是会调整自己的大小和重新定位。
是否有某种布局或可以将按钮“锁定”到位,以便在我移动/调整大小/添加其他按钮时不受影响?
谢谢, 鲍勃
【问题讨论】:
扩展汤姆所说的话......
要让组件变得不可见但保持其位置,您可以将它与空标签一起放置在 CardLayout 中,然后交换可见的。
您可以按如下方式创建一个类来为您执行此操作。主要只是显示一个示例,如果您单击一个按钮,它会在保留其位置的同时被删除。我输入了 showComponent/hideComponent 和 setVisible(t/f) - 取决于你喜欢的风格。
这可能无法完全满足您的需求,但可能对您的应用程序的一部分有用。
public class Placeholder extends JPanel {
private static final long serialVersionUID = 1L;
private CardLayout cardLayout_;
public Placeholder(JComponent component) {
cardLayout_ = new CardLayout();
setLayout(cardLayout_);
add(component, "visible"); // the component
add(new JLabel(), "hidden"); // empty label
}
public void showComponent() {
cardLayout_.show(this, "visible");
}
public void hideComponent() {
cardLayout_.show(this, "hidden");
}
public void setComponentVisible(boolean visible) {
if (visible)
showComponent();
else
hideComponent();
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setLayout(new GridLayout(2,0));
for (int n = 1; n < 10; n++) {
JButton b = new JButton(n + "");
final Placeholder placeholder = new Placeholder(b);
f.add(placeholder);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
placeholder.hideComponent();
}
});
}
f.pack();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
【讨论】:
我建议您更改其可见性属性(setVisible),而不是添加和删除按钮。一些布局管理器会忽略不可见的组件,因此您可能需要在与原始组件的首选/最小/最大尺寸相同的位置添加一个非 opqaue(或匹配的背景)组件。更简单的你可能想使用OverlayLayout。
【讨论】:
您可以使用 GridBagLayout 将它们保持在网格中,但允许它们调整大小
【讨论】:
扩展其他人所说的话......
除了使组件不可见之外,您还可以禁用它们...
当然,这取决于您的应用程序和您的偏好。
除了上面提到的布局,还有一些免费的,比如 TableLayout 和通用的 MigLayout。
【讨论】:
这可能取决于您使用的开发环境。
在 Netbeans 中,您可以右键单击控件容器(窗体/面板)并从多个布局选项中进行选择。 'Absolute Layout' 将允许您定位控件而不自动调整它们的大小,尽管它不会让您将控件放在彼此之上。
【讨论】:
我建议你检查A Visual Guide to Layout Managers。根据您想要的外观和功能,有不同的布局可能适合您。如果主要问题是调整大小操作(我假设是父 JFrame o JPanel),Spring Layout 允许您建立关于组件相对位置的约束。
【讨论】: