为了账号安全,请及时绑定邮箱和手机立即绑定

Swing JTextField文本更改为侦听器DocumentListener无限循环

Swing JTextField文本更改为侦听器DocumentListener无限循环

萧十郎 2021-05-13 18:19:11
好的,我有一个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中的“用户名”属性中,您可以:

  1. DocumentListener从文本字段中删除

  2. 更新文本字段

  3. 添加DocumentListener回文本字段。

我尝试了DocumentListener,但是它不起作用,抛出了异常:java.lang.IllegalStateException:尝试在通知中进行更改

仅作为参考,为了摆脱该消息,您可以将代码包装在Swing utilities.invokeLater()中,以便在侦听器代码完成执行之后执行该代码。尽管我认为您仍然会遇到无限循环。


查看完整回答
反对 回复 2021-05-26
  • 2 回答
  • 0 关注
  • 234 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信