根据用户选择更改确认对话框的布局

时间:2013-11-28 20:32:44

标签: java swing

我有一个程序将超类Animal的CowsDogsCats注册到某种DataCollection。用户按下“添加动物”按钮,然后我想打开一个ConfirmDialog,其中JPanel作为参数,首先只有3个复选框:Cow[] - Dog[] - Cat[]并根据用户选择的内容为此类动物需要的数据添加适当的文本字段。

有没有办法在复选框被“选中”时添加一个监听器,然后只添加我想要的那个类型的新字段,或者是否有更聪明的方法来执行此操作?

1 个答案:

答案 0 :(得分:0)

对于每种动物类型,创建一个具有专门输入组件的面板,并将所有三个面板放在使用CardLayout的单独JPanel中。 CardLayout在任何给定时间显示其中一个孩子;每个子项都由您选择的字符串标识符标识,您必须在添加子项时指定。

这比动态添加组件更好,因为CardLayout将始终确保容器的首选大小足以容纳所有子项,因此当您更改哪些组件可见时,对话框不会随意乱转。

private static final String COW_CARD_ID = "cow";
private static final String DOG_CARD_ID = "dog";
private static final String CAT_CARD_ID = "cat";

void buildConfirmDialog() {

    JPanel cowFieldsPanel = new JPanel();
    // Add cow-specific components here

    JPanel dogFieldsPanel = new JPanel();
    // Add dog-specific components here

    JPanel catFieldsPanel = new JPanel();
    // Add cat-specific components here

    final CardLayout cardLayout = new CardLayout();
    final JPanel animalSpecificFieldsPanel = new JPanel(cardLayout);
    animalSpecificFieldsPanel.add(cowFieldsPanel, COW_CARD_ID);
    animalSpecificFieldsPanel.add(dogFieldsPanel, DOG_CARD_ID);
    animalSpecificFieldsPanel.add(catFieldsPanel, CAT_CARD_ID);

    JRadioButton cowButton = // ...
    JRadioButton dogButton = // ...
    JRadioButton catButton = // ...

    cowButton.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent event) {
            if (event.getStateChange() == ItemEvent.SELECTED) {
                cardLayout.show(animalSpecificFieldsPanel, COW_CARD_ID);
            }
        }
    });

    dogButton.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent event) {
            if (event.getStateChange() == ItemEvent.SELECTED) {
                cardLayout.show(animalSpecificFieldsPanel, DOG_CARD_ID);
            }
        }
    });

    catButton.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent event) {
            if (event.getStateChange() == ItemEvent.SELECTED) {
                cardLayout.show(animalSpecificFieldsPanel, CAT_CARD_ID);
            }
        }
    });

    ButtonGroup buttonGroup = new ButtonGroup();
    buttonGroup.add(cowButton);
    buttonGroup.add(dogButton);
    buttonGroup.add(catButton);
}

值得一提的是,当期望用户从多个项目列表中选择一个项目时,您应该使用单选按钮,而不是复选框。在Swing中,JRadioButtons几乎总是被添加到一个共同的ButtonGroup中,因此它们将具有一个多功能。

相关问题