Foro de elhacker.net

Programación => Java => Mensaje iniciado por: ~~ en 19 Agosto 2008, 02:19 am



Título: JPopupMenu que no responde a eventos
Publicado por: ~~ en 19 Agosto 2008, 02:19 am
Hola, veréis, ando haciendo una aplicación que lee una base de datos y la muestra en un JTable.

La cosa es que la tabla tiene unos campos en los que puedes elegir entre varias opciones predeterminadas y para seleccionar unas u otras he decidido mostrar un JPopupMenu, ya que insertar un JComboBox se me hacía demasiado largo :P

Lo añado así:
Código
  1.        JPopupMenu pop = new JPopupMenu();
  2.        JMenu sub = new JMenu("Submenu");    
  3.            sub.add(new JMenuItem("Subitem 1"));
  4.            sub.add(new JMenuItem("Subitem 2"));
  5.        pop.add(sub);
  6.        pop.add(new JMenuItem("Item 1"));
  7.        pop.add(new JMenuItem("Item 2"));
  8.  
  9.        pop.setLocation(evt.getLocationOnScreen());
  10.        pop.setVisible(true);;

Lo raro es que al posicionar el ratón sobre el sub-menú no se extienden los sub-elementos ni nada, como lo hacen los menus normales...

(http://img127.imageshack.us/img127/8899/screenshot2zj7.png) (http://imageshack.us)

Estoy usando NetBeans, pero si añado los menúes desde el editor tampoco me funciona... Alguna sugerencia de como hacerlo o algún ejemplillo?

Muchas gracias por adelantado
Salu2



Título: Re: JPopupMenu que no responde a eventos
Publicado por: Ferсhu en 19 Agosto 2008, 02:58 am
la parte de MouseListener esta ???

aca hay unos ejemplos de menus, entre ellos popmenu, aver si te sirven:

http://ji.ehu.es/LMAlonso/SW/java/Bib/tutorjava/html/ui/swingcomponents/menu.html


Título: Re: JPopupMenu que no responde a eventos
Publicado por: ~~ en 19 Agosto 2008, 14:59 pm
A ver, la cosa es que si añado un menú normal con el ejemplo mismo que viene el la web que me has pasado, cuando el menú pierde el foco (haces click por el formulario) desaparece automáticamente o al colocar el ratón sobre un menú con submenús automáticamente se muestran los submenús...

Con el JPopupMenu no pasa eso, yo lo muestro, si hago click en el formulario, incluso si lo muevo se queda por ahí flotando y tampoco me muestra los submenús.. me toca hacerlo a mano o que? que eventos se supone que tengo que escuchar para que haga eso?

Salu2


Título: Re: JPopupMenu que no responde a eventos
Publicado por: Ferсhu en 20 Agosto 2008, 07:04 am
creo q es por q no implementas "actionlistener", pero nose como declaraste la clase. por otro lado como creas los menu items ahi si estoy seguro q no le asignas nada. Aca te dejo el ejemplo de esa web, pero le sake un par de cosas y le agregue un sub menu, al clickear en cualkier subitem se detecta el evento, dsp veras lo q haces con ello.

Código:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JPopupMenu;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.ButtonGroup;
import javax.swing.JMenuBar;
import javax.swing.ImageIcon;

import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JFrame;

/*
 * This class adds popup menus to MenuDemo.
 */
public class PopupMenuDemo extends JFrame implements ActionListener, ItemListener {
    JTextArea output;
    JScrollPane scrollPane;
    String newline = "\n";
    JPopupMenu popup;

    public PopupMenuDemo() {
        JMenuBar menuBar;
        JMenu menu, submenu;
        JMenuItem menuItem;
        JRadioButtonMenuItem rbMenuItem;
        JCheckBoxMenuItem cbMenuItem;

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        //Add regular components to the window, using the default BorderLayout.
        Container contentPane = getContentPane();
        output = new JTextArea(5, 30);
        output.setEditable(false);
        scrollPane = new JScrollPane(output);
        contentPane.add(scrollPane, BorderLayout.CENTER);

     
        // MIRA DE ACA........
        //Create the popup menu.
        popup = new JPopupMenu();
       
        menuItem = new JMenuItem("A popup menu item");
        menuItem.addActionListener(this);
        popup.add(menuItem);
       
        JMenu sub = new JMenu("Submenu");             
        menuItem = new JMenuItem("Subitem 1");
        menuItem.addActionListener(this);
        sub.add(menuItem);       
        menuItem = new JMenuItem("Subitem 2");
        menuItem.addActionListener(this);
        sub.add(menuItem);       
        popup.add(sub);
             
        //......HASTA ACA

        //Add listener to components that can bring up popup menus.
        MouseListener popupListener = new PopupListener();
        output.addMouseListener(popupListener);
        scrollPane.addMouseListener(popupListener);
       
    }

    public void actionPerformed(ActionEvent e) {
        JMenuItem source = (JMenuItem)(e.getSource());
        String s = "Action event detected."
                   + newline
                   + "    Event source: " + source.getText()
                   + " (an instance of " + getClassName(source) + ")";
        output.append(s + newline);
    }

    public void itemStateChanged(ItemEvent e) {
        JMenuItem source = (JMenuItem)(e.getSource());
        String s = "Item event detected."
                   + newline
                   + "    Event source: " + source.getText()
                   + " (an instance of " + getClassName(source) + ")"
                   + newline
                   + "    New state: "
                   + ((e.getStateChange() == ItemEvent.SELECTED) ?
                     "selected":"unselected");
        output.append(s + newline);
    }

    // Returns just the class name -- no package info.
    protected String getClassName(Object o) {
        String classString = o.getClass().getName();
        int dotIndex = classString.lastIndexOf(".");
        return classString.substring(dotIndex+1);
    }

    public static void main(String[] args) {
        PopupMenuDemo window = new PopupMenuDemo();

        window.setTitle("PopupMenuDemo");
        window.setSize(450, 260);
        window.setVisible(true);
    }

    class PopupListener extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            maybeShowPopup(e);
        }

        public void mouseReleased(MouseEvent e) {
            maybeShowPopup(e);
        }

        private void maybeShowPopup(MouseEvent e) {
            if (e.isPopupTrigger()) {
                popup.show(e.getComponent(),
                           e.getX(), e.getY());
            }
        }
    }
}


Saludos!!


Título: Re: JPopupMenu que no responde a eventos
Publicado por: ~~ en 20 Agosto 2008, 14:01 pm
Ok, muchas gracias Ferchu me miraré con detalle el código a ver que es lo que me falta ;)

Salu3

EDIT -> Gracias Ferchu, ya me funciona ^^


Título: Re: JPopupMenu que no responde a eventos
Publicado por: sapito169 en 21 Agosto 2008, 02:36 am
exelente codigo gracias