2012-08-13 2 views
1

Dans this thread, je l'ai trouvé un moyen de mettre en œuvre AutoComplete fonction dans un JTextField (et JComboBox, mais pas de problème à ce sujet).JTextField AutoCompletion Erreur

Lorsque vous tentez d'implémenter cette fonctionnalité dans un JTextField, il émet certaines exceptions. Le code suivant montrera le problème. C'est tellement simple, beaucoup similaire à la façon dont j'ai utilisé JComboBox, qui fonctionne très bien.

Quelqu'un peut-il m'aider à trouver une solution?

Voici le code:
(S'il vous plaît noter que j'utilise swingx)

import javax.swing.JList; 
import org.jdesktop.swingx.JXFrame; 
import org.jdesktop.swingx.JXTextField; 
import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator; 

public class ErrorDemo { 

    public static void main(String[] args) { 
     JXFrame frame = new JXFrame("Error Demo"); 
     JXTextField field = new JXTextField(); 
     String[] users = {"aaa", "bbb", "ccc"}; 
     AutoCompleteDecorator.decorate(new JList(users), field); 

     frame.getContentPane().add(field); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setDefaultCloseOperation(JXFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

Ceci est le message d'erreur que je reçois:
(il est un peu long: D)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at org.jdesktop.swingx.autocomplete.ListAdaptor.valueChanged(ListAdaptor.java:76) 
    at javax.swing.JList.fireSelectionValueChanged(JList.java:1765) 
    at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1779) 
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167) 
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:147) 
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:194) 
    at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:388) 
    at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:398) 
    at javax.swing.DefaultListSelectionModel.setSelectionInterval(DefaultListSelectionModel.java:442) 
    at javax.swing.JList.setSelectedIndex(JList.java:2179) 
    at javax.swing.JList.setSelectedValue(JList.java:2295) 
    at org.jdesktop.swingx.autocomplete.ListAdaptor.setSelectedItem(ListAdaptor.java:98) 
    at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.setSelectedItem(AutoCompleteDocument.java:317) 
    at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.insertString(AutoCompleteDocument.java:265) 
    at javax.swing.text.JTextComponent.replaceSelection(JTextComponent.java:1358) 
    at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(DefaultEditorKit.java:859) 
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636) 
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2849) 
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2884) 
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2812) 
    at java.awt.Component.processEvent(Component.java:5815) 
    at java.awt.Container.processEvent(Container.java:2058) 
    at java.awt.Component.dispatchEventImpl(Component.java:4410) 
    at java.awt.Container.dispatchEventImpl(Container.java:2116) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848) 
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:697) 
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:962) 
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:834) 
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:661) 
    at java.awt.Component.dispatchEventImpl(Component.java:4282) 
    at java.awt.Container.dispatchEventImpl(Container.java:2116) 
    at java.awt.Window.dispatchEventImpl(Window.java:2429) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121) 

Répondre

2

Il n'y a pas de JList impliqué dans votre code. Je pense qu'il devrait lire quelque chose comme ça ...

 org.jdesktop.swingx.autocomplete.AutoCompleteDecorator.decorate(field, Arrays.asList(users), false); 

Si vous voulez lier un JList à un TextField (de sorte que le champ de texte mettra à jour la sélection du JList) que vous voulez decorate(JList list, JTextComponent textComponent, ObjectToStringConverter stringConverter) à la place ...