Foros del Web » Programación para mayores de 30 ;) » Java »

Buscador tipo Facebook

Estas en el tema de Buscador tipo Facebook en el foro de Java en Foros del Web. Que tal colegas. Miren tengo el siguiente problema: Estoy intentando hacer un buscador (tipo Facebook (fotografia,nombre)) que basicamente es un JTextField y al momento de ...
  #1 (permalink)  
Antiguo 15/07/2011, 14:42
 
Fecha de Ingreso: junio-2011
Mensajes: 14
Antigüedad: 12 años, 10 meses
Puntos: 1
Pregunta Buscador tipo Facebook

Que tal colegas.
Miren tengo el siguiente problema:
Estoy intentando hacer un buscador (tipo Facebook (fotografia,nombre)) que basicamente es un JTextField y al momento de ir escribiendo el nombre de una persona despliega un JPopupMenu con JMenuItems que muestra las coincidendias. Hasta el momento me funciona de maravilla lo unico que no puedo hacer es que, funcione la tecla ENTER en el JPopupMenu ya que al ir escribiendo va mostrando el JPopupMenu con las coincidencias entonces el JTextField pierde el foco lo que hago es regresarlo con RequestFocus al JTextField, pero al hacer eso el JPopupMenu pierde el foco y cuando me cambio de nuevo al JPopupMenu no funciona el ENTER para hacer ejecutar el ActionPerformed tengo que darle clic sobre las opciones para que funcione y quiero que sea con Enter para mayor rapidez.


Alguien ha hecho algo similar? o con que otros controles podre hacer algo parecido?

Les dejo mi codigo pór si pudieran ayudarmen.

Código:
JPopupMenu menu;

private void JTxfBuscadorkeyPressed(java.awt.event.KeyEvent evt){

        menu = new JPopupMenu();
        if(evt.getKeyCode()!=KeyEvent.VK_DOWN&evt.getKeyCode()!=KeyEvent.VK_UP&evt.getKeyCode()!=KeyEvent.VK_RIGHT&evt.getKeyCode()!=KeyEvent.VK_LEFT&evt.getKeyCode()!=KeyEvent.VK_ENTER){             
                    if(!JTxfBuscador.getText().equals("")&&JTxfBuscador.getText().length()>3){
                        if(PersonaEnMira.buscar(JTxfBuscador.getText())){
                            if(PersonaEnMira.getNumeroDeResultados()>0){
                                for(int x=0;x<PersonaEnMira.getNumeroDeResultados();x++){
                                    System.out.println("agregando:" + PersonaEnMira.getResultados()[x][0] +","+ PersonaEnMira.getResultados()[x][1]);
                                    addListaResultados(Integer.parseInt(PersonaEnMira.getResultados()[x][0]), PersonaEnMira.getResultados()[x][1],evt);
                                }
                            }else{
                            menu.add(new JLabel("No se encontraron resultados"));                        
                        }
                        }else{
                            JOptionPane.showMessageDialog(MDIPP, PersonaEnMira.getError(),"Error",JOptionPane.ERROR_MESSAGE);
                        }
                    }
                    
                    menu.show(evt.getComponent(), 0, 20);
                    JTxfBuscador.requestFocus();
                }else if(evt.getKeyCode()==KeyEvent.VK_ENTER){
                    // entra aqui cuando presiono enter y deveria de entrar en 
                    // el evento del JPopUpMenu
        }
        else if(evt.getKeyCode()==KeyEvent.VK_DOWN){
                    System.out.println("Presionó down en else if");
                    menu.requestFocus();
        }
        
    }

private void addListaResultados(final int IdPersona,final String nombre_ap_am,java.awt.event.KeyEvent evt){
        final JMenuItem item;
        controladores.Sistema sistema = new controladores.Sistema();        
item = new JMenuItem(nombre_ap_am,new ImageIcon(sistema.getDirectorioFotografias()+IdPersona+"/perfil_mini.jpg"));
            item.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {                                     
                    System.out.println("cambiando a: " + IdPersona);
                    PersonaEnMira.setIdPersona(IdPersona);
                    bolActualizando = false;
                    PersonaEnMira.refresh();
                    JTxfBuscador.setText("");
                }
            });
            if(evt.getKeyCode()==KeyEvent.VK_ENTER){
                    System.out.println("cambiando a Persona: " + IdPersona);
                    PersonaEnMira.setIdPersona(IdPersona);
                    bolActualizando = false;
                    PersonaEnMira.refresh();
                    JTxfBuscador.setText("");
            }
            menu.add(item);
    }
  #2 (permalink)  
Antiguo 16/07/2011, 15:26
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: Buscador tipo Facebook

Eso ultimo que escribes casi no se entiende.

Estas manejando los eventos cuando se pierde el foco de tu Jtextfield ?

Mira: Si tienes un JTexTField y este pierde el foco, el evento que debes manejar es para ocultar el JPopupMenu y nada mas.
Si este JTExtField obtiene el foco, el evento que manejas es para mostrar el JPopupMenu

* Si das click en la concidencia debes manejar los eventos para pasar el nombre completo (De esa coincidencia) al JTextField

Y ya es todo. Con un enter realizas la accion apartir del valor que del JtextField, o incluso la podrias realizar esta accion desde antes, al dar click sobre la coincidencia mostrada en el JPopupMenu.


Bueno, Al menos es lo que recomiendo.

Saludos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #3 (permalink)  
Antiguo 28/07/2011, 16:33
 
Fecha de Ingreso: marzo-2010
Mensajes: 11
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Buscador tipo Facebook

Que tal amigo, supongo que para estas fechas ya debes haber implementado una solución o el proyecto ya no lo necesitas si era para la escuela. Pero aquí te dejo una solución que acabo de implementar ya que estoy desarrollando un sistema con ese tipo de buscador.

Lo que hice fué agregar al JTextField un CaretLister y un KeyListener. El primero para que conforme un caracter se fuera insertando el sistema realizara una consulta y el segundo para que escuchara solamente a dos teclas; la tecla Enter y la tecla VK_DOWN (flecha hacia abajo).

Implementé un método dentro de mi clase que creara el JPopupMenu. Este método es invocado cada vez que el método caretUpdate(CaretEvent e) (método abstracto de la interfaz CaretLister ) recibe un evento. Dentro de mi método crearPopup() defino la caracteristica .setFocusable(false) para el JPopupMenu de esta manera mientras se teclea dentro del JTextField éste no pierde el foco.

Cuando sobre el JTextField se teclea Enter el evento lo recibo con el método abstracto keyReleased(KeyEvent e) (de la interfaz KeyListener) y realizo esto: myFirstItem.doClick() lo cual es como si el usuario hubiera hecho click en el primer item de mi pop-up.

Saludos, seguro a más de uno le servirá esta información :D
  #4 (permalink)  
Antiguo 30/07/2011, 14:44
 
Fecha de Ingreso: junio-2011
Mensajes: 14
Antigüedad: 12 años, 10 meses
Puntos: 1
Respuesta: Buscador tipo Facebook

gracias por la respuesta, pero como es de que cambias del JTextField al JPopupMenu
por que no he podido hacer eso con el JPopupMenu.requestFocus(); en el evento keyreleased del jtextfield

saludos!
  #5 (permalink)  
Antiguo 01/08/2011, 16:14
 
Fecha de Ingreso: marzo-2010
Mensajes: 11
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Buscador tipo Facebook

No pude encontrar la solución cuando se presiona la tecla hacia abajo en el primer intento.
Lo que hice fué recibir el keyEvent del TextField para cuando se oprima la tecla VK_DOWN

if(evento.getKeyCode() == evento.VK_DOWN){

interfaz.requestFocusInWindow();
popup.setVisible(false);//Oculta el pop-up
popup.setFocusable(true);//Para que pueda ganar el foco de la aplicacion cuando se muestre
jpm.show(textfield, 0, 20);
}

Esta fué la solución que implementé, como ya te había dicho desafortunamente el usuario puede acceder al 1er menuItem del pop-up cuando presiona dos veces la tecla VK_DOWN. Si lo encuentras la solución al primer teclazo me avisas :)

Etiquetas: facebook, jmenuitem, jpopupmenu, jtextfield, buscadores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:26.