Come un elenco di suggerimenti per quando si digita all’interno del campo di testo

Ciao nella mia applicazione Java swing ho bisogno di mostrare tutte le possibili voci esistenti con la stessa iniziale
caratteri, mentre l’utente a digitare in un campo di testo. Permette di dire che tipo di utente lettera ‘a’ in Un campo di testo che dovrebbe essere un paese ‘America’ e ‘Africa’ sarebbe suggerimenti. In modo che l’utente può selezionarne uno dall’elenco. Elenco di paese risiede nel mio database. So come recuperare i dati dal DB. Ma non so come li elenco e quali componenti dovrei usare per ottenere.
Chi mi guida? O se è possibile fornire un esempio, che sarebbe grande.

InformationsquelleAutor nath | 2011-07-13

 

4 Replies
  1. 7

    Si potrebbe utilizzare il completamento automatico pacchetto da SwingX. Google per “swingx completamento automatico” se avete bisogno di più esempi di vita reale, ma il modo più semplice è la creazione di un JComboBox e chiamando
    AutoCompleteDecorator.decorate(comboBox);
    su di esso.

    • Che server si esegue il collegamento viene giù. Questo è il problema con i link nelle risposte.
  2. 4

    Si dovrebbe provare JComboBox come autosuggest box, invece di JTextField. Ma se volete essere fatto utilizzando JTextField poi…

    1. Fare un JPanel che contiene l’elenco di suggestione.Inizialmente non sarà visibile.
    2. Ogni volta che utente digita qualcosa di cercare e aggiungere i risultati per la lista in JPanel.
    3. Mostra che JPanel in fondo textfield in strato superiore del telaio.
    4. Implementare evento click sulla lista, in modo che quando l’utente fa clic su di esso il testo viene copiato textfield.
  3. 3

    c’ sono due classi (si sono necessari per il corretto funcionalities), Auto Completa JTextField e il completamento automatico JComboBox, eccellente, è che è possibile impostare se è stretto (consente di specificare se l’Elenco non contiene ) o non

  4. -1

    Ho avuto un problema simile:

    Volevo un Textfield per libero immissione di testo, ma con la possibilità di suggerire i valori esistenti.

    Ho trovato questo post, ma swingX non è consentito immettere il testo diverso suggerito quelli.
    Poi ho trovato un altro post il collegamento a questa pagina:
    http://www.jroller.com/santhosh/date/20050620

    Alcune modifiche e ho cambiato la directory di selezione per la mia Stringhe. Potrebbe questo post qui per il completamento e l’aiuto per la successiva ricercatori:

    Ha fatto una classe astratta AutoCompleter che handels eventi:

    //@author Santhosh Kumar T - [email protected] 
    public abstract class AutoCompleter{ 
        JList list = new JList(); 
        JPopupMenu popup = new JPopupMenu(); 
        JTextComponent textComp; 
        private static final String AUTOCOMPLETER = "AUTOCOMPLETER"; //NOI18N 
    
        public AutoCompleter(JTextComponent comp){ 
            textComp = comp; 
            textComp.putClientProperty(AUTOCOMPLETER, this); 
            JScrollPane scroll = new JScrollPane(list); 
            scroll.setBorder(null); 
    
            list.setFocusable( false ); 
            scroll.getVerticalScrollBar().setFocusable( false ); 
            scroll.getHorizontalScrollBar().setFocusable( false ); 
    
            popup.setBorder(BorderFactory.createLineBorder(Color.black)); 
            popup.add(scroll); 
    
            if(textComp instanceof JTextField){ 
                textComp.registerKeyboardAction(showAction, KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), JComponent.WHEN_FOCUSED); 
                textComp.getDocument().addDocumentListener(documentListener); 
            }else 
                textComp.registerKeyboardAction(showAction, KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, KeyEvent.CTRL_MASK), JComponent.WHEN_FOCUSED); 
    
            textComp.registerKeyboardAction(upAction, KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), JComponent.WHEN_FOCUSED); 
            textComp.registerKeyboardAction(hidePopupAction, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_FOCUSED); 
    
            popup.addPopupMenuListener(new PopupMenuListener(){ 
                public void popupMenuWillBecomeVisible(PopupMenuEvent e){ 
                } 
    
                public void popupMenuWillBecomeInvisible(PopupMenuEvent e){ 
                    textComp.unregisterKeyboardAction(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)); 
                } 
    
                public void popupMenuCanceled(PopupMenuEvent e){ 
                } 
            }); 
            list.setRequestFocusEnabled(false); 
        } 
    
        static Action acceptAction = new AbstractAction(){ 
            public void actionPerformed(ActionEvent e){ 
                JComponent tf = (JComponent)e.getSource(); 
                AutoCompleter completer = (AutoCompleter)tf.getClientProperty(AUTOCOMPLETER); 
                completer.popup.setVisible(false); 
                completer.acceptedListItem((String)completer.list.getSelectedValue()); 
            } 
        }; 
    
        DocumentListener documentListener = new DocumentListener(){ 
            public void insertUpdate(DocumentEvent e){ 
                showPopup(); 
            } 
    
            public void removeUpdate(DocumentEvent e){ 
                showPopup(); 
            } 
    
            public void changedUpdate(DocumentEvent e){} 
        }; 
    
        private void showPopup(){ 
            popup.setVisible(false); 
            if(textComp.isEnabled() && updateListData() && list.getModel().getSize()!=0){ 
                if(!(textComp instanceof JTextField)) 
                    textComp.getDocument().addDocumentListener(documentListener); 
                textComp.registerKeyboardAction(acceptAction, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_FOCUSED); 
                int size = list.getModel().getSize(); 
                list.setVisibleRowCount(size<10 ? size : 10); 
    
                int x = 0; 
                try{ 
                    int pos = Math.min(textComp.getCaret().getDot(), textComp.getCaret().getMark()); 
                    x = textComp.getUI().modelToView(textComp, pos).x; 
                } catch(BadLocationException e){ 
                    //this should never happen!!! 
                    e.printStackTrace(); 
                } 
                popup.show(textComp, x, textComp.getHeight()); 
            }else 
                popup.setVisible(false); 
            textComp.requestFocus(); 
        } 
    
        static Action showAction = new AbstractAction(){ 
            public void actionPerformed(ActionEvent e){ 
                JComponent tf = (JComponent)e.getSource(); 
                AutoCompleter completer = (AutoCompleter)tf.getClientProperty(AUTOCOMPLETER); 
                if(tf.isEnabled()){ 
                    if(completer.popup.isVisible()) 
                        completer.selectNextPossibleValue(); 
                    else 
                        completer.showPopup(); 
                } 
            } 
        }; 
    
        static Action upAction = new AbstractAction(){ 
            public void actionPerformed(ActionEvent e){ 
                JComponent tf = (JComponent)e.getSource(); 
                AutoCompleter completer = (AutoCompleter)tf.getClientProperty(AUTOCOMPLETER); 
                if(tf.isEnabled()){ 
                    if(completer.popup.isVisible()) 
                        completer.selectPreviousPossibleValue(); 
                } 
            } 
        }; 
    
        static Action hidePopupAction = new AbstractAction(){ 
            public void actionPerformed(ActionEvent e){ 
                JComponent tf = (JComponent)e.getSource(); 
                AutoCompleter completer = (AutoCompleter)tf.getClientProperty(AUTOCOMPLETER); 
                if(tf.isEnabled()) 
                    completer.popup.setVisible(false); 
            } 
        }; 
    
        /** 
         * Selects the next item in the list.  It won't change the selection if the 
         * currently selected item is already the last item. 
         */ 
        protected void selectNextPossibleValue(){ 
            int si = list.getSelectedIndex(); 
    
            if(si < list.getModel().getSize() - 1){ 
                list.setSelectedIndex(si + 1); 
                list.ensureIndexIsVisible(si + 1); 
            } 
        } 
    
        /** 
         * Selects the previous item in the list.  It won't change the selection if the 
         * currently selected item is already the first item. 
         */ 
        protected void selectPreviousPossibleValue(){ 
            int si = list.getSelectedIndex(); 
    
            if(si > 0){ 
                list.setSelectedIndex(si - 1); 
                list.ensureIndexIsVisible(si - 1); 
            } 
        } 
    
        //update list model depending on the data in textfield 
        protected abstract boolean updateListData(); 
    
        //user has selected some item in the list. update textfield accordingly... 
        protected abstract void acceptedListItem(String selected); 
    }

    E un Esempio per gestire il Contenuto del PopUp:

    //@author Santhosh Kumar T - [email protected] 
    public class FileAutoCompleter extends AutoCompleter{ 
        public FileAutoCompleter(JTextComponent comp){ 
            super(comp); 
        } 
    
        protected boolean updateListData(){ 
            String value = textComp.getText(); 
            int index1 = value.lastIndexOf('\\'); 
            int index2 = value.lastIndexOf('/'); 
            int index = Math.max(index1, index2); 
            if(index==-1) 
                return false; 
            String dir = value.substring(0, index+1); 
            final String prefix = index==value.length()-1 ? null : value.substring(index + 1).toLowerCase(); 
            String[] files = new File(dir).list(new FilenameFilter(){ 
                public boolean accept(File dir, String name){ 
                    return prefix!=null ? name.toLowerCase().startsWith(prefix) : true; 
                } 
            }); 
            if(files == null){ 
                list.setListData(new String[0]); 
                return true; 
            } else{ 
                if(files.length==1 && files[0].equalsIgnoreCase(prefix)) 
                    list.setListData(new String[0]); 
                else 
                    list.setListData(files); 
                return true; 
            } 
        } 
    
        protected void acceptedListItem(String selected){ 
            if(selected==null) 
                return; 
    
            String value = textComp.getText(); 
            int index1 = value.lastIndexOf('\\'); 
            int index2 = value.lastIndexOf('/'); 
            int index = Math.max(index1, index2); 
            if(index==-1) 
                return; 
            int prefixlen = textComp.getDocument().getLength()-index-1; 
            try{ 
                textComp.getDocument().insertString(textComp.getCaretPosition(), selected.substring(prefixlen), null); 
            } catch(BadLocationException e){ 
                e.printStackTrace(); 
            } 
        } 
    }

    Tutto è chiamato in programma con

    new FileAutoCompleter(yourJTextField);

Lascia un commento