我有一个具有多个“标志”按钮(JToggleButton)的视图。当用户单击标志按钮时,我想更新一个数组,以跟踪标记了哪些按钮。这很简单,这就是我所做的:

...
   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)。

我也考虑过使用双重调度,但这将需要重写触发JToggleButtonitemStateChange()方法,而且我不知道那是什么(这似乎很不安全)。

关于如何在不进行尝​​试/捕获,条件检查等的情况下使其工作的任何建议?

最佳答案

我认为您必须明确检查Type。

  if(ie.getSource() instanceof JToggleButton){
      //toggle button logic
  }else{
      //something else
  }


另外,您可以使用匿名内部类来实现您的侦听器,而不必完全检查源。



像这样:

 toggleBtn.addItemListener(new ItemListener(){
         public void itemStateChange(ItemEvent ie){
            //handle toggle button event
         }
 });

10-07 15:42