绕行到actionPerformed()返回void

时间:2011-03-28 14:10:55

标签: java swing jbutton listeners

我正在尝试使用MVC设计。

在模型中,我想要一个像这样的方法

public boolean changeSomeData(...){
    boolean b;
    //create a dialog with an OK button
    return b;
}

如果实际进行了更改,我希望该方法返回TRUE。更改在OK按钮的actionPerformed方法内完成。

我的问题是我不能写b = true;在OK按钮的actionPerform中,因为我必须将b声明为final才能在actionPerformed()中使用它。

我所做的是创建一个类

private class MyBoolean {
    boolean b;
}

然后

public boolean changeSomeData(...){
    MyBoolean myBoolean;
    //create a dialog with an OK button
    actionPerformed(){
        //make changes in the data
        myBoolean.b=true;
    }
    boolean b = myBoolean.b;
    return b;
}

但我对这个解决方案感觉并不好,我想知道我做的是否正确以及是否有更好的解决方案。 如果没有进行更改,我应该更好地抛出异常吗? (例如,如果用户点击“取消”而不是“确定”)

3 个答案:

答案 0 :(得分:1)

  

在模型中,我想要一个像这样的方法...... //使用OK按钮创建一个对话框

我认为这已经是一个缺陷,因为模型不应该直接对视图做任何事情。

更好的方法是打开对话框(使用控制器),为ActionEvent注册“OK”(以及actionPerformed),然后在该方法中进行任何更改。< / p>

编辑:

您可能需要考虑以下粗略方法:

视图将自身或关联的类注册为模型作为侦听器。每当模型被更改时,它都会触发事件以通知视图更改。

控制器在视图上注册自己,并在视图更改时得到通知。如果用户更改数据,则控制器可以打开对话框并仅提交用户信号“OK”的更改。因此,如果需要更改数据,模型永远不会检查自己。这实际上是控制器的任务,如果控制器将更改传递给模型,它应该应用它们。

答案 1 :(得分:1)

实现任务的更好方法是在对话框上保留一个变量,指示是否已成功进行更改。然后有一个模型类调用的方法来检索值并返回它。

类似的东西:

public boolean changeSomeData(...){
    //create a dialog with an OK button
    return dialog.isSuccess();
}

答案 2 :(得分:0)

一种方法可以让这段代码更清晰......

public boolean changeSomeData() {

   // note that this is not a class boolean, no need to do extra autoboxing.

   boolean dataChanged = false;

   // check the old value against the new value
   // for classes

   if (oldvalue.equals(newValue)) {
      oldValue = newValue;
      dataChanged = true;
   }

   // for pimitives (built-ins)

   if (oldvalue == newValue) {
      oldValue = newValue;
      dataChanged = true;
   }

   // odds are good that the above action performed was supposed to call this
   // changeSomeData() and not the other way around.

   // if you must fire actionPerformed() when data has changed, then do so
   // like this, otherwise if it was added as part of the "solution" you can
   // skip it.

   if (dataChanged) {
      actionPeformed();
   }

   return dataChanged;
}

请注意,此代码为Controller代码,因为它直接操作模型,并且(可能)更新视图。