好的,我有一个swing事件侦听器有问题...简短的介绍我开发了一个Java应用程序,它具有由MVC模式构成的Swing UI。
MyView->文本由用户更改,并且视图应通过控制器通知模型
MyModel->存储数据,并通过控制器通知有关更改的视图
MyController->用于通知模型和查看更改的接口
基于此类,模型和视图仅通过控制器类连接。视图类包含用于用户输入的文本字段,该字段应使用用户输入来更新模型类,而无需按下按钮。这意味着我需要JTextField的侦听器,以等待用户输入/更改文本...
我试过了,DocumentListener
但是不起作用,抛出了异常:java.lang.IllegalStateException: Attempt to mutate in notification
我认为这里的问题是,如果属性更改了,并且控制器再次通知/更改了视图,则模型类也调用了控制器->结果:无限循环
MyModel.java
public void setHost(String host) // Method called by controller to change model
{
String oldHost = this.host;
this.host = host;
this.firePropertyChange("Host", oldHost, this.host); // Model inform view about changes
}
MyView.java
@Override public void modelPropertyChange(final PropertyChangeEvent event)
{
// Method used to update view and called by controller
if(event.getPropertyName().equals("Username"))
{
String username = (String) event.getNewValue();
this.nameField.setText(username);
}
}
问题是,由于用户输入了模型更改的内容而调用文档侦听器时,调用了属性更改的view方法,而view用相同的文本替换了文本,这再次引发了文档更改事件,并且侦听器被称为...。环形
我尝试使用ActionListener它可以正常工作,但是用户必须按回车键才能分配更改...是否还有其他选项可以监听JTextField中没有的文本更改DocumentListener?或者我应该通过我的MVC模式更改什么来解决此问题?
泛舟湖上清波郎朗
相关分类