Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:透明地处理状态更改事件_Java_Oop - Fatal编程技术网

Java:透明地处理状态更改事件

Java:透明地处理状态更改事件,java,oop,Java,Oop,我有一个视图,它有几个“标志”按钮(JToggleButton)。当用户单击一个标记按钮时,我想更新一个数组,该数组跟踪标记了哪些按钮。这很简单,以下是我所做的: ... bflag[i].addItemListener(this); //View listens to state change ... void itemStateChange(ItemEvent ie) { try { jtb = (JToggleButton)ie.getSource();

我有一个视图,它有几个“标志”按钮(
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) {}
 toggleBtn.addItemListener(new ItemListener(){
         public void itemStateChange(ItemEvent ie){
            //handle toggle button event
         }
 });
这更好,但唯一的问题是,即使源是
JToggleButton
,也会触发
Object
方法(因为
JToggleButton
毕竟是
对象)

我也考虑过使用双重分派,但这需要重写触发
itemStateChange()
JToggleButton
方法,我不知道这是什么(这似乎不安全)


关于如何在不使用try/catch、条件检查等的情况下使其工作的任何建议?

我认为您必须明确检查类型

  if(ie.getSource() instanceof JToggleButton){
      //toggle button logic
  }else{
      //something else
  }
或者,您可以使用匿名内部类来实现侦听器,从而避免完全检查源代码


大概是这样的:

void itemStateChange(ItemEvent ie) {
   handleStateChange(ie.getSource());
}

void handleStateChange(JToggleButton jtb) {
   //handle state change
}

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

我认为,您必须明确地检查类型

  if(ie.getSource() instanceof JToggleButton){
      //toggle button logic
  }else{
      //something else
  }
或者,您可以使用匿名内部类来实现侦听器,从而避免完全检查源代码


大概是这样的:

void itemStateChange(ItemEvent ie) {
   handleStateChange(ie.getSource());
}

void handleStateChange(JToggleButton jtb) {
   //handle state change
}

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

我认为这比演员检查要难看得多(或者至少同样难看)。请详细说明“匿名内部类”方案。@tandu即使instanceof运算符不能改善代码的美观性,也可能比使用异常作为流控制机制更好。我还用一个使用匿名内部类的示例更新了答案。匿名内部类需要了解视图才能更新数组。内部类可以访问包含类的任何成员。因此,如果数组可以从包含类访问,那么它应该可以从内部类访问。啊,你是对的。但唯一的问题是数组需要相对于切换按钮(有多个切换按钮)进行更新,并且匿名类也无法判断是哪个按钮触发了事件!我认为这比演员检查要难看得多(或者至少同样难看)。请详细说明“匿名内部类”方案。@tandu即使instanceof运算符不能改善代码的美观性,也可能比使用异常作为流控制机制更好。我还用一个使用匿名内部类的示例更新了答案。匿名内部类需要了解视图才能更新数组。内部类可以访问包含类的任何成员。因此,如果数组可以从包含类访问,那么它应该可以从内部类访问。啊,你是对的。但唯一的问题是数组需要相对于切换按钮(有多个切换按钮)进行更新,并且匿名类也无法判断是哪个按钮触发了事件!