Java 自动完成文本字段

Java 自动完成文本字段,java,textfield,Java,Textfield,我使用的是在stackoverflow上发布的Autosuggerstor文本字段 这个非常好的组件允许您从字典中的匹配单词列表中进行选择,以更快地使用正确的sintax(一种智能感知)编写 当一个键入的单词只有一个匹配项,空格键被点击时,我试图添加自动完成的功能 下面的内容应该可以做到这一点 private void checkForAndShowSuggestions() { String text=textField.getText(); boolean hitSpace

我使用的是在stackoverflow上发布的Autosuggerstor文本字段

这个非常好的组件允许您从字典中的匹配单词列表中进行选择,以更快地使用正确的sintax(一种智能感知)编写

当一个键入的单词只有一个匹配项,空格键被点击时,我试图添加自动完成的功能

下面的内容应该可以做到这一点

private void checkForAndShowSuggestions() {
    String text=textField.getText();

    boolean hitSpace=false;

    if (text.contains(" "))
        hitSpace =  text.lastIndexOf(" ")==text.length()-1;
    if(labelz.size()==1&&hitSpace){
        labelz.get(0).replaceWithSuggestedText();
        return;
    }
其中labelz包含最后一个建议列表

但是我得到了错误

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
    at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1338)
    at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:658)
    at javax.swing.text.JTextComponent.setText(JTextComponent.java:1669)
    at ygg.desktop.vm.components.SuggestionLabel.replaceWithSuggestedText(SuggestionLabel.java:89)
    at ygg.desktop.vm.components.AutoSuggestor.checkForAndShowSuggestions(AutoSuggestor.java:183)
    at ygg.desktop.vm.components.AutoSuggestor.access$0(AutoSuggestor.java:174)
    at ygg.desktop.vm.components.AutoSuggestor$1.insertUpdate(AutoSuggestor.java:44)
    at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:201)
    at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748)
    at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:707)
    at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130)
    at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:669)
    at javax.swing.text.JTextComponent.replaceSelection(JTextComponent.java:1328)
    at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(DefaultEditorKit.java:884)
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2882)
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2929)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2845)
    at java.awt.Component.processEvent(Component.java:6310)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
    at java.awt.Component.dispatchEventImpl(Component.java:4760)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
显然,我不能改变这个线程内的文本字段,有什么办法吗?类似于添加labelz.get(0.replaceWithSuggestedText();某种队列的代码

这里是在我的源代码中生成异常的地方

void replaceWithSuggestedText() {
    String suggestedWord = getText(); 
    String text = textField.getText(); 
    String typedWord = autoSuggestor.getCurrentlyTypedWord(); 
    String t = text.substring(0, text.lastIndexOf(typedWord)); 
    String tmp = t + text.substring(text.lastIndexOf(typedWord)).replace(typedWor‌​d, suggestedWord); 
    textField.setText(tmp + " ");//exception line
    }

错误发生在
replaceWithSuggestedText
中,请提供其代码,最好是提供.void replaceWithSuggestedText(){String suggestedWord=getText();String text=textField.getText();String typedWord=autosuggester.getCurrentlyTypedWord();String t=text.substring(0,text.lastIndexOf(typedWord));字符串tmp=t+text.substring(text.lastIndexOf(typedWord)).replace(typedWord,suggestedWord);textField.setText(tmp+“”);//异常行}如何编辑?完整的代码在顶部的链接中报告,我只添加了我发布的行您的错误堆栈显示您正在使用
DocumentListener
,请检查此问题:这一个谢谢!SwingUtilities.invokeLater(Runnable)完成了这个技巧,现在我得到了ifinite autocompletes XD,但我可以解决这个问题