CardLayout - 使其占用最少的空间

时间:2010-11-09 14:32:58

标签: java swing cardlayout

所有

我有一个用Java创建的表单类型视图。基于组合框的内容,我需要切换表单的某些方面。我正在使用cardlayout来做到这一点,它工作正常。

问题是,cardlayouts使用添加到其中的组件的所有首选大小的最大值来确定它们自己的首选大小。这意味着当我选择具有较少字段的选项时,由于切换器组件上的cardlayout的首选大小,因此存在空白。

每次选择更改时,我都尝试手动更改cardlayout面板的首选大小,但这没有任何效果 - 面板始终是适合所有组件的最大值。

combo.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent e) {
            Dimension preferredSize = null;
            switch (combo.getSelectedIndex()) {
                case 0:
                    preferredSize = panel0.getPreferredSize();
                    break;
                case 1:
                    preferredSize = panel1.getPreferredSize();
                    break;
                case 2:
                    preferredSize = panel2.getPreferredSize();
                    break;
                default:
                    assert false;
            }
            patternOptions.setPreferredSize(preferredSize);
            c.show(patternOptions, TYPE[combo.getSelectedIndex()]);
        }
    });

简而言之,我希望UI能够在选择需要更多空间的选项时动态增长,并在需要更少空间时缩小,就像iTunes智能列表UI一样:

alt text alt text

(我意识到这是一个稍微不同的问题,但它说明了我想要的东西 - 持有约束字段的面板正在根据行数增长。我需要根据选项的数量增加布局,基于组合框选择)

2 个答案:

答案 0 :(得分:2)

您可以继承CardLayout并覆盖preferredLayoutSize方法,以便它只考虑当前的卡片。

要确保框架增长和缩小,您可能需要在设置内容大小后调用pack。不确定这是否适用于所有情况(可能不会收缩),但值得一试。

答案 1 :(得分:1)

听起来你应该为每个表单使用JDialog。

或者不要打扰使用CardLayout并手动删除/替换每个面板,然后打包()对话框。