Estoy interesado en la prestación de un autocompletado de caja en un JFrame. El mecanismo de activación se basa en la mnemotecnia (creo), pero no estoy realmente seguro de lo que debe utilizar para el «autocompletado de cuadro» (me gustaría que los resultados sean filtrados como el usuario presiona las teclas).

¿Cómo implementar esto? Algún tipo de JFrame, o un JPopupMenu?

Me gustaría saber cómo se implementa, así que por favor no publicar enlaces disponibles [J]Componentes.

  • Por favor, publicar la solución cuando se tiene.
  • Ok Oscar , yo lo haré.
  • Véase también this similar respuesta
InformationsquelleAutor Geo | 2009-01-27

8 Comentarios

  1. 10

    Hay un ejemplo para la auto-realización para el área de texto en

    Del sol tutoriales «el Uso de los Componentes Swing».

    Que está hecho en el estilo de los procesadores de texto (no pop ups, pero el

    sugirió que el texto se escribe delante del cursor).

    Simplemente desplácese hacia abajo para «Otro Ejemplo: TextAreaDemo»

    ant golpear el botón de Lanzamiento!

    • El vínculo es el de hoy, roto.
    • El enlace no funciona de nuevo. Creo que Oracle revocó la decisión de romper con el reenvío de sun.com direcciones Url.
  2. 13

    Es posible que desee probar el libre Autocompletar componente más en SwingLabs.

    http://swinglabs.org

    Edit: Este sitio parece haberse movido http://java.net/projects/swinglabs

    Hay un ejemplo de cómo implementar este código en:

    http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/autocomplete/package-summary.html

  3. 7

    Aquí es un ejemplo con un pop-up como usted pidió. Usted puede iniciar este ejemplo en la parte inferior de la página.

    Aquí está mi ejemplo simplificado. Lamentablemente, usted tiene que hacer clic en el campo de texto de primero,
    antes de empezar a escribir, o usted conseguirá excepciones. Si alguien puede averiguar por qué, por favor, hágamelo saber/actualización de esta respuesta.

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class _Autocompleter {
    
      private final static JPopupMenu textPopupMenu
          = new JPopupMenu("MENU") {
    
        {
          add(new JMenuItem("item 1"));
          add(new JMenuItem("item 2"));
          setFocusable(false);
        }
    
      };
    
      private final static KeyListener textInputListener
          = new KeyAdapter() {
    
        @Override
        public void keyTyped(KeyEvent e) {
          Point p = textInput.getCaret().getMagicCaretPosition();
          if (textPopupMenu.isVisible()) {
            SwingUtilities.convertPointToScreen(p, textInput);
            textPopupMenu.setLocation(p.x, p.y + 20);
          } else {
            textPopupMenu.show(textInput, p.x, p.y + 20);
          }
        }
    
      };
    
      private final static JTextArea textInput
          = new JTextArea("type something") {
    
        {
          addKeyListener(textInputListener);
          setCaretPosition(getText().length());
        }
    
      };
    
      private final static JFrame f = new JFrame("TEST") {
    
        {
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
          add(textInput);
    
          setSize(400, 60);
          setLocationRelativeTo(null);
          setVisible(true);
        }
    
      };
    
      public static void main(String[] args)
          throws Exception {
            //YES, IT'S EMPTY !!!
            //It'll start anyway because of static initializers
      }
    
    }
    • Ah! He descubierto lo que está mal! 1) ignorar la posición del cursor cuando el campo de texto está vacío! 2) Utilizar en lugar de KeyListener algo como UndoableEditListener.
  4. 0

    Me gustaría añadir un actionListener así que usted puede conseguir cada tecla que se pulsa.

    Se puede se puede, a continuación, hacer una búsqueda en el fondo (en otro hilo)

    • Pero , a qué componente se puede añadir el ActionListener ?
    • El componente para el cual usted estará proporcionando la función de finalización automática.
    • DocumentListener es la mejor opción para auto-completar JTextField.
  5. 0

    Utilizar este

    import java.awt.*;
    import java.awt.event.*;
    
    import javax.swing.*;
    
    public class Autocompleter2
    {
        //~ Methods ------------------------------------------------------------------------------------
    
        public static void main(String[] args)
          throws Exception
        {
            //YES, IT'S EMPTY !!!
            //It'll start anyway because of static initializers
            SwingUtilities.invokeLater(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        final JPopupMenu textPopupMenu = new JPopupMenu("MENU")
                        {
    
                            {
                                add(new JMenuItem("item 1"));
                                add(new JMenuItem("item 2"));
                                setFocusable(false);
                            }
                        };
    
                        final JTextArea textInput = new JTextArea("type something la")
                        {
    
                            {
                                setCaretPosition(getText().length());
                            }
                        };
    
                        KeyListener textInputListener = new KeyAdapter()
                        {
                            @Override
                            public void keyTyped(KeyEvent e)
                            {
                                Point p = textInput.getCaret().getMagicCaretPosition();
    
                                if (textPopupMenu.isVisible())
                                {
                                    SwingUtilities.convertPointToScreen(p, textInput);
                                    textPopupMenu.setLocation(p.x, p.y + 20);
                                }
                                else
                                {
                                    textPopupMenu.show(textInput, p.x, p.y + 20);
                                }
                            }
                        };
    
                        textInput.addKeyListener(textInputListener);
                        new JFrame("TEST")
                            {
    
                                {
                                    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                    add(textInput);
                                    setSize(400, 60);
                                    setLocationRelativeTo(null);
                                    setVisible(true);
                                }
                            };
                    }
                    ;
                });
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here