Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    JcomboBox con suggerimento testo

    Voglio realizzare un campo di testo (JComboBox) in cui, mentre si scrive si apre la tendina con i suggerimenti. Ho cercato di farlo da solo ma ho difficoltà.
    Ho trovato questo codice in rete, ma analizzandolo passo passo mi perdo e non riesco a capire come funziona.
    C'è qualcuno che sa aiutarmi ?

    codice:
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
    
    public class S09ShowPopup extends PlainDocument {
        JComboBox comboBox;
        ComboBoxModel model;
        JTextComponent editor;
        // flag to indicate if setSelectedItem has been called
        // subsequent calls to remove/insertString should be ignored
        boolean selecting = false;
    
        public S09ShowPopup(final JComboBox comboBox) {
            this.comboBox = comboBox;
            model = comboBox.getModel();
            editor = (JTextComponent) comboBox.getEditor().getEditorComponent();
    
            comboBox.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("actionListener");
                    if (!selecting) highlightCompletedText(0);
                }
            });
    
            editor.addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent e) {
                    // if  (e.getKeyCode() == KeyEvent.VK_S)
                    System.out.println("addKeyListener");
                    if (comboBox.isDisplayable()) comboBox.setPopupVisible(true);
                }
            });
        }
    
        public void remove(int offs, int len) throws BadLocationException {
            // return immediately when selecting an item
            System.out.println("remove");
            if (selecting) return;
            super.remove(offs, len);
        }
    
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            // return immediately when selecting an item
            System.out.println("insertString");
            if (selecting) return;
    
            // insert the string into the document
            super.insertString(offs, str, a);
            System.out.println("super.insertString");
    
            // lookup and select a matching item
            System.out.println("\n"+getText(0, getLength()));
            Object item = lookupItem(getText(0, getLength()));
    
            if (item != null) {
    
                System.out.println("dentro if di insertString "+item);
                setSelectedItem(item);
    
            } else {
                
                System.out.println("dentro else di insertString "+item);
    
                // keep old item selected if there is no match
                item = comboBox.getSelectedItem();
    
                // imitate no insert (later on offs will be incremented by str.length(): selection won't move forward)
                offs = offs - str.length();
    
                // provide feedback to the user that his input has been received but can not be accepted
                comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
            }
            // setText(item.toString());
            // select the completed part
            highlightCompletedText(offs + str.length());
        }
    
        private void setText(String text) throws BadLocationException {
            // remove all text and insert the completed string
            System.out.println("setText");
            super.remove(0, getLength());
            super.insertString(0, text, null);
        }
    
        private void highlightCompletedText(int start) {
            System.out.println("highlightCompletedText");
            editor.setSelectionStart(start);
            editor.setSelectionEnd(getLength());
        }
    
        private void setSelectedItem(Object item) {
            System.out.println("setSelectedItem");
            selecting = true;
            model.setSelectedItem(item);
            selecting = false;
        }
    
        private Object lookupItem(String pattern) {
            
            System.out.println("\nlookupItem");
            
            System.out.println("\nprima della getSelectedItem");
            Object selectedItem = model.getSelectedItem();
            System.out.println("\ndopo della getSelectedItem");
    
            // System.out.println("\n"+selectedItem);
            System.out.println(model.getSize());
            comboBox.addItem("prova");
            // qui viene chiamata la remove e poi la insertString
    
    
            System.out.println(model.getSize());
    
            // only search for a different item if the currently selected does not match
            if (selectedItem != null && startsWithIgnoreCase(selectedItem.toString(), pattern)) {
                return selectedItem;
            } else {
                // iterate over all items
                for (int i=0, n=model.getSize(); i < n; i++) {
                    Object currentItem = model.getElementAt(i);
                    // current item starts with the pattern?
                    if (startsWithIgnoreCase(currentItem.toString(), pattern)) {
                        return currentItem;
                    }
                }
            }
            
            System.out.println("No match");
            // no item starts with the pattern => return null
            return null;
        }
    
        // checks if str1 starts with str2 - ignores case
        private boolean startsWithIgnoreCase(String str1, String str2) {
            // System.out.println("startsWithIgnoreCase");
            System.out.println(str1.toUpperCase()+" -- "+str2.toUpperCase());
            System.out.println(str1.toUpperCase().startsWith(str2.toUpperCase()));
            return str1.toUpperCase().startsWith(str2.toUpperCase());
        }
    
        private static void createAndShowGUI() {
            // the combo box (add/modify items if you like to)
            JComboBox comboBox = new JComboBox(new Object[] {"Ester", "Jordi", "Jordina", "Jorge", "Sergi"});
            // has to be editable
            comboBox.setEditable(true);
            // get the combo boxes editor component
            JTextComponent editor = (JTextComponent) comboBox.getEditor().getEditorComponent();
            // change the editor's document
            editor.setDocument(new S09ShowPopup(comboBox));
    
            // create and show a window containing the combo box
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(3);
            frame.getContentPane().add(comboBox);
            frame.pack(); frame.setVisible(true);
        }
    
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    Non ci sono Queen senza Freddie !

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Nella libreria SwingX c'è un decoratore per JComboBox che aggiunge la funzionalità che stai cercando di implementare, dagli un'occhiata
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    In futuro, come espressamente indicato nel Regolamento interno (Punto 6), usa i tag CODE per il posting del codice. In questo modo rimane l'indentazione e se ne migliora la leggibilità.

    Sistemo il tuo post.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.