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运算符不能改善代码的美观性,也可能比使用异常作为流控制机制更好。我还用一个使用匿名内部类的示例更新了答案。匿名内部类需要了解视图才能更新数组。内部类可以访问包含类的任何成员。因此,如果数组可以从包含类访问,那么它应该可以从内部类访问。啊,你是对的。但唯一的问题是数组需要相对于切换按钮(有多个切换按钮)进行更新,并且匿名类也无法判断是哪个按钮触发了事件!