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 
     } 
}); 
+0

我认为这是远高于铸铁检查丑陋的(或至少是同样难看)。请详细说明“匿名内部班级”计划。 – 2011-05-19 13:30:53

+0

@tandu尽管instanceof运算符没有提高代码的美感,但最好将异常用作流控制机制。我还用一个使用匿名内部类的例子更新了答案。 – 2011-05-19 13:38:21

+0

匿名内部类需要知道视图才能更新数组。它没有。 – 2011-05-19 14:17:31