JPopupMenu que no responde a eventos

Iniciado por ~~, 19 Agosto 2008, 02:19 AM

0 Miembros y 1 Visitante están viendo este tema.

~~

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 (java) [Seleccionar]

        JPopupMenu pop = new JPopupMenu();
        JMenu sub = new JMenu("Submenu");     
            sub.add(new JMenuItem("Subitem 1"));
            sub.add(new JMenuItem("Subitem 2"));
        pop.add(sub);
        pop.add(new JMenuItem("Item 1"));
        pop.add(new JMenuItem("Item 2"));
           
        pop.setLocation(evt.getLocationOnScreen());
        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...


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


Ferсhu

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

~~

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

Ferсhu

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.

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!!

~~

#4
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 ^^

sapito169

#5
exelente codigo gracias