我在用JComboBox做一个单选下拉,只要在文本框中输入相关字符,它就会自动检录到符合条件的第一个item上,比如:输入一个预字,JComboBox下拉就会检录到预备党员,并且选择预备党员,但是时候却出现异常,我搞了好久都不知道是为什么会出现这样的错,希望各位大哥帮忙看看,告诉我解决方案,谢谢!
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
public class JComboBoxText extends JFrame
{ private static final long serialVersionUID = 1L;
@SuppressWarnings("rawtypes")
JComboBox combox;
JTextField textfield;
CnToSpell cotospell;
@SuppressWarnings({ "rawtypes", "unchecked" })
public JComboBoxText()
{
setBounds(100,100,600,600);
setLayout(null);
cotospell=new CnToSpell();
 combox=new JComboBox();
combox.setBounds(50,50,100,20);
combox.setEditable(true);
combox.addItem("输入或选择");
combox.addItem("党员");
combox.addItem("党员a");
combox.addItem("党员b");
combox.addItem("党员c");
combox.addItem("党员d");
combox.addItem("党员e");
combox.addItem("党员f");
combox.addItem("党员g");
combox.addItem("党员h");
combox.addItem("党员i");
combox.addItem("党员j");
combox.addItem("预备党员");
combox.addItem("群众");
textfield=(JTextField)combox.getEditor().getEditorComponent();
combox.setMaximumRowCount(6);
getContentPane().add(combox);
setVisible(true);
textfield.addCaretListener(new CaretListener(){
public void caretUpdate(CaretEvent event) 
{
combox.showPopup();

for(int i=0; i<combox.getItemCount(); i++)
{
int by=textfield.getText().getBytes().length;
int ch=textfield.getText().length();
Object obj=combox.getItemAt(i);
String st=obj.toString();
if(st.startsWith(textfield.getText()) && by!=ch && i !=0)
{
combox.setSelectedIndex(i);
textfield.setText(st);
System.out.println("i="+i);
break;
}
}
}
});

}
public  static void main(String[] a)
{
new JComboBoxText();
}
}

解决方案 »

  1.   

    CnToSpell和他没关系的,CnToSpell只是将输入的文字翻译成拼音。这是错误:
    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.contentsChanged(Unknown Source)
    at javax.swing.AbstractListModel.fireContentsChanged(Unknown Source)
    at javax.swing.DefaultComboBoxModel.setSelectedItem(Unknown Source)
    at javax.swing.JComboBox.setSelectedItem(Unknown Source)
    at javax.swing.JComboBox.setSelectedIndex(Unknown Source)
    at JComboBoxText$1.caretUpdate(JComboBoxText.java:56)
    at javax.swing.text.JTextComponent.fireCaretUpdate(Unknown Source)
    at javax.swing.text.JTextComponent$MutableCaretEvent.fire(Unknown Source)
    at javax.swing.text.JTextComponent$MutableCaretEvent.stateChanged(Unknown Source)
    at javax.swing.text.DefaultCaret.fireStateChanged(Unknown Source)
    at javax.swing.text.DefaultCaret.changeCaretPosition(Unknown Source)
    at javax.swing.text.DefaultCaret.handleSetDot(Unknown Source)
    at javax.swing.text.DefaultCaret.setDot(Unknown Source)
    at javax.swing.text.DefaultCaret$Handler.insertUpdate(Unknown Source)
    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 javax.swing.text.JTextComponent.replaceInputMethodText(Unknown Source)
    at javax.swing.text.JTextComponent.processInputMethodEvent(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.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(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)