我有一个程序将超类Animal的Cows
,Dogs
和Cats
注册到某种DataCollection
。用户按下“添加动物”按钮,然后我想打开一个ConfirmDialog
,其中JPanel
作为参数,首先只有3个复选框:Cow[]
- Dog[]
- Cat[]
并根据用户选择的内容为此类动物需要的数据添加适当的文本字段。
有没有办法在复选框被“选中”时添加一个监听器,然后只添加我想要的那个类型的新字段,或者是否有更聪明的方法来执行此操作?
答案 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中,因此它们将具有一个多功能。