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

好的,我有一个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模式更改什么来解决此问题?


萧十郎
浏览 235回答 2
2回答

泛舟湖上清波郎朗

在您的PropertyChangeListener中的“用户名”属性中,您可以:DocumentListener从文本字段中删除更新文本字段添加DocumentListener回文本字段。我尝试了DocumentListener,但是它不起作用,抛出了异常:java.lang.IllegalStateException:尝试在通知中进行更改仅作为参考,为了摆脱该消息,您可以将代码包装在Swing utilities.invokeLater()中,以便在侦听器代码完成执行之后执行该代码。尽管我认为您仍然会遇到无限循环。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java