我正在尝试使用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;
}
但我对这个解决方案感觉并不好,我想知道我做的是否正确以及是否有更好的解决方案。 如果没有进行更改,我应该更好地抛出异常吗? (例如,如果用户点击“取消”而不是“确定”)
答案 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
代码,因为它直接操作模型,并且(可能)更新视图。