gpt4 book ai didi

使用 setModel() 更新 JComboBox 时出现 java.lang.IllegalStateException?

转载 作者:行者123 更新时间:2023-12-01 18:32:16 25 4
gpt4 key购买 nike

我试图用 setModel() 更新 JComboBox。但是,它会抛出 java.lang.IllegalStateException。具体来说,我使用 JTextField 指向 JComboBox 的可编辑组件,并在每次 JTextField 收到新输入时更新 JComboBox。

谁能告诉我原因吗?

package ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class TestFrame extends JFrame implements DocumentListener {

private static final long serialVersionUID = 1L;

// tool bar
private JToolBar topToolBar;
private JTextField wordSearchField;
private JComboBox<String> wordSearchTips;

// window size
private static final int width = 700;
private static final int height = 500;

public TestFrame() {
}

public static void main(String[] argv) {
new TestFrame().CreateUI();
}

public void CreateUI() {
setPreferredSize(new Dimension(width, height));
setResizable(false);
setLayout(new BorderLayout());

// bottom
JPanel bottom = new JPanel();
bottom.setPreferredSize(new Dimension(width, 480));
bottom.setLayout(new BorderLayout());

// top
topToolBar = new JToolBar();
topToolBar.setBackground(Color.WHITE);
topToolBar.setPreferredSize(new Dimension(width, 30));

wordSearchTips = new JComboBox<String>();
wordSearchTips.setEditable(true);
wordSearchTips.setSelectedIndex(-1);
wordSearchField = (JTextField) wordSearchTips.getEditor()
.getEditorComponent();
wordSearchField.getDocument().addDocumentListener(this);

topToolBar.add(wordSearchTips);

add(topToolBar, BorderLayout.NORTH);
add(bottom, BorderLayout.SOUTH);

pack();
setVisible(true);

}

@Override
public void changedUpdate(DocumentEvent e) {

}

@Override
public void insertUpdate(DocumentEvent e) {

String keyword = wordSearchField.getText().trim();
DefaultComboBoxModel<String> m = new DefaultComboBoxModel<String>();
;
for (int i = 0; i < 10; i++) {
m.addElement(i + "");
}
wordSearchTips.setModel(m);
wordSearchTips.setSelectedIndex(-1);
((JTextField) wordSearchTips.getEditor().getEditorComponent())
.setText(keyword);
wordSearchTips.showPopup();
}

@Override
public void removeUpdate(DocumentEvent e) {
}
}

以下是异常(exception)情况:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
at javax.swing.text.AbstractDocument.writeLock(Unknown Source)
at javax.swing.text.AbstractDocument.replace(Unknown Source)
at javax.swing.text.JTextComponent.setText(Unknown Source)
at javax.swing.plaf.metal.MetalComboBoxEditor$1.setText(Unknown Source)
at javax.swing.plaf.basic.BasicComboBoxEditor.setItem(Unknown Source)
at javax.swing.JComboBox.configureEditor(Unknown Source)
at javax.swing.plaf.basic.BasicComboBoxUI$Handler.propertyChange(Unknown Source)
at javax.swing.plaf.basic.BasicComboBoxUI$PropertyChangeHandler.propertyChange(Unknown Source)
at javax.swing.plaf.metal.MetalComboBoxUI$MetalPropertyChangeListener.propertyChange(Unknown Source)
at java.beans.PropertyChangeSupport.fire(Unknown Source)
at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
at java.awt.Component.firePropertyChange(Unknown Source)
at javax.swing.JComboBox.setModel(Unknown Source)
at ui.TestFrame.insertUpdate(TestFrame.java:94)
at javax.swing.text.AbstractDocument.fireInsertUpdate(Unknown Source)
at javax.swing.text.AbstractDocument.handleInsertString(Unknown Source)
at javax.swing.text.AbstractDocument.insertString(Unknown Source)
at javax.swing.text.PlainDocument.insertString(Unknown Source)
at javax.swing.text.AbstractDocument.replace(Unknown Source)
at javax.swing.text.JTextComponent.replaceSelection(Unknown Source)
at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(Unknown Source)
at javax.swing.SwingUtilities.notifyAction(Unknown Source)
at javax.swing.JComponent.processKeyBinding(Unknown Source)
at javax.swing.JComponent.processKeyBindings(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

insertUpdate(DocumentEvent e) 中的代码包装在 SwingUtilities.invokeLater()

关于使用 setModel() 更新 JComboBox 时出现 java.lang.IllegalStateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23671101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com