2

我计划创建一个要求用户在多个字段中输入数据的应用程序,但是可能并不总是使用某些字段。我将为其开发此程序的人希望每次都能选择他要使用的字段。我想到了以下内容(但我不确定该怎么做):

首先,显示所有可用字段的列表以及用于选择每个字段的复选框。然后,准备好所有字段的 JFrame,并根据用户的选择,布置表单以抑制未使用的字段并消除可能出现的任何间隙。(我考虑过对框架的组件使用 setvisible() ,然后找到一种方法来消除它们之间的间隙,这些间隙在隐藏不需要的元素时会出现)。但我认为这不是最有效的方法。无需说框架应该看起来井井有条且美观。我愿意接受建议,并在此先感谢您。

如果有任何不同,我将为此使用 netbeans 设计模式。

4

2 回答 2

6

http://docs.oracle.com/javase/6/docs/api/java/awt/Window.html#pack ()

JFrame有一个pack()方法,它将调整窗口大小以适应其内容。

于 2012-09-25T03:49:58.897 回答
4

与布局要求一样,任务是找到一个合适的 LayoutManager,然后让它完成工作:即弄清楚如何根据组件的可见性分配可用空间。有了这个,你的工作归结为切换可见性并向后倾斜。

大多数核心管理者只是忽略隐藏的组件(可能是也可能不是你想要的)。高级管理器可以进行全方位配置——从与可见组件完全相同的方式处理到忽略。Fi MigLayout(我个人目前最喜欢的),具有 4 个级别的隐藏模式(相同方式,将组件大小设置为 0,0,将组件大小设置为 0,0,周围的所有间隙都为零,完全忽略)

下面是一个简单的示例:尝试隐藏模式的不同排列,将文本字段的标签与文本字段一起隐藏以查看不同的行为。

// hidemode 3 == ignore in layout
// hidemode 2 == zero size and zero gaps
// hidemode 1 == zero size
// hidemode 0 == same as visible
MigLayout layout = new MigLayout("wrap 2, hidemode 3");
JComponent content = new JPanel(layout);
JPopupMenu popup = new JPopupMenu();
for (int i = 0; i < 5; i++) {
    JTextField field = new JTextField("field " + i, 20);
    field.setName(field.getText());
    JLabel label = new JLabel("Label " + i);
    label.setLabelFor(field);
    content.add(label);
    content.add(field);
    popup.add(new JCheckBoxMenuItem(new ToggleVisibilityAction(field, true)));
}
content.setComponentPopupMenu(popup);

// action to toggle the visibility of a target component
// optionally w/out its label
public static class ToggleVisibilityAction extends AbstractAction {

    private JComponent target;
    private boolean hideLabel;

    public ToggleVisibilityAction(JComponent comp, boolean hideLabel) {
        super(comp.getName());
        this.target = comp;
        this.hideLabel = hideLabel;
        putValue(SELECTED_KEY, target.isVisible());
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        boolean visible = (boolean) getValue(SELECTED_KEY);
        target.setVisible(visible);
        if (hideLabel && target.getClientProperty("labeledBy") instanceof JComponent) {
            ((Component) target.getClientProperty("labeledBy")).setVisible(visible);
        }
        target.getParent().revalidate();
    }

}
于 2012-09-25T08:45:17.877 回答