Java:透明地处理状态改变事件
问题描述:
我有一个视图有几个“标志”按钮(JToggleButton
)。当用户点击一个标志按钮时,我想更新一个数组来跟踪哪些按钮被标记。这是非常简单的,这里是我做了什么:Java:透明地处理状态改变事件
...
bflag[i].addItemListener(this); //View listens to state change
...
void itemStateChange(ItemEvent ie) {
try {
jtb = (JToggleButton)ie.getSource();
//Update mark array
}
catch (ClassCastException cce) {}
}
这只是正常的,但它是丑陋与try/catch语句。我更喜欢做这样的事情:
void itemStateChange(ItemEvent ie) {
handleStateChange(ie.getSource());
}
void handleStateChange(JToggleButton jtb) {
//handle state change
}
void handleStateChange(Object o) {}
这是好得多,但唯一的问题是,Object
方法将火,即使源是JToggleButton
(因为JToggleButton
毕竟是一个Object
) 。
我也考虑过使用双派遣,但是这将需要覆盖JToggleButton
方法引发itemStateChange()
,我不知道那是什么(并且看起来不安全)。
有关如何在没有尝试/赶上,有条件检查等情况下工作的任何建议?
答
你将不得不明确检查类型,我认为。
if(ie.getSource() instanceof JToggleButton){
//toggle button logic
}else{
//something else
}
或者,您可以使用匿名内部类来实现您的侦听器,并避免必须完全检查源。
事情是这样的:
toggleBtn.addItemListener(new ItemListener(){
public void itemStateChange(ItemEvent ie){
//handle toggle button event
}
});
我认为这是远高于铸铁检查丑陋的(或至少是同样难看)。请详细说明“匿名内部班级”计划。 – 2011-05-19 13:30:53
@tandu尽管instanceof运算符没有提高代码的美感,但最好将异常用作流控制机制。我还用一个使用匿名内部类的例子更新了答案。 – 2011-05-19 13:38:21
匿名内部类需要知道视图才能更新数组。它没有。 – 2011-05-19 14:17:31