好的,我有一个swing事件侦听器有问题...简短的介绍我开发了一个Java应用程序,它具有由MVC模式构成的Swing UI。MyView->文本由用户更改,并且视图应通过控制器通知模型MyModel->存储数据,并通过控制器通知有关更改的视图MyController->用于通知模型和查看更改的接口基于此类,模型和视图仅通过控制器类连接。视图类包含用于用户输入的文本字段,该字段应使用用户输入来更新模型类,而无需按下按钮。这意味着我需要JTextField的侦听器,以等待用户输入/更改文本...我试过了,DocumentListener但是不起作用,抛出了异常:java.lang.IllegalStateException: Attempt to mutate in notification我认为这里的问题是,如果属性更改了,并且控制器再次通知/更改了视图,则模型类也调用了控制器->结果:无限循环MyModel.javapublic 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模式更改什么来解决此问题?
2 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
在您的PropertyChangeListener中的“用户名”属性中,您可以:
DocumentListener
从文本字段中删除更新文本字段
添加
DocumentListener
回文本字段。
我尝试了DocumentListener,但是它不起作用,抛出了异常:java.lang.IllegalStateException:尝试在通知中进行更改
仅作为参考,为了摆脱该消息,您可以将代码包装在Swing utilities.invokeLater()中,以便在侦听器代码完成执行之后执行该代码。尽管我认为您仍然会遇到无限循环。
添加回答
举报
0/150
提交
取消