Swing Mouse Click Event for JMenu and JPopupMenu

六月ゝ 毕业季﹏ 提交于 2019-12-22 09:43:51

问题


I would like to have Eclipse behavior for mouse clicks outside menus and popup menus in Swing. Basically, in Eclipse, when you press the mouse OUTSIDE the menu, the menu disappears and the mouse press event is forwarded to the component on which you clicked with the mouse.

Irritatingly, Swing does not do this, and I can't find a way around it.

Right now, even with Windows LAF, i have to click a second time to get the component to register the mouse click.

For the sake of the response just do it on a table

final JPopupMenu popupMenu = new JPopupMenu();
JMenuItem viewProfile = new JMenuItem("View Profile");
viewProfile.addActionListener(new ActionListener() { 
   public void actionPerformed(ActionEvent e) {
   }
});
popupMenu.add(viewProfile);
table.setComponentPopupMenu(popupMenu);

EDIT: here is a test code. I don't think it is convenient to add a mouse listener to every simple component so they can register mouse clicks after a popup menu. In the following example, the Table does implement it, but not the Button.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TestMouse {

   public static void main(String[] args) {
      new TestMouse();
   }

   private JLabel  counter;

   private int     count;

   private JPanel  northPanel;

   private JButton clickMe;

   public TestMouse() {
      EventQueue.invokeLater(new Runnable() {

         @Override
         public void run() {
            try {
               UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
            }

            DefaultTableModel model = new DefaultTableModel(new Object[] { "A", "B", "B", "B", "B", "B", "B" }, 10);
            JTable table = new JTable(model);

            northPanel = new JPanel();

            clickMe = new JButton("Button");
            clickMe.addActionListener(new ActionListener() {

               @Override
               public void actionPerformed(ActionEvent e) {
                  System.out.println("clicked");
                  count++;
               }
            });
            counter = new JLabel("0");

            northPanel.add(counter);
            northPanel.add(clickMe);

            final JPopupMenu popupMenu = new JPopupMenu();
            JMenuItem viewProfile = new JMenuItem("View Profile");
            viewProfile.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
               }
            });
            popupMenu.add(viewProfile);
            table.setComponentPopupMenu(popupMenu);
            table.addMouseListener(new MouseAdapter() {

               @Override
               public void mouseClicked(MouseEvent e) {
                  System.out.println("clicked");
                  count++;
                  counter.setText(String.valueOf(count));
               }

            });

            JFrame frame = new JFrame("Testing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(northPanel, BorderLayout.NORTH);
            frame.add(new JScrollPane(table));
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
         }
      });
   }

}

回答1:


I don't seem to be able to replicate the issue.

When I right click the table, the popup menu appears and when I click the table again (to dismiss the popup), the mouseClicked event is triggered.

Note the counter in the north position...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TestMouse {

    public static void main(String[] args) {
        new TestMouse();
    }

    private JLabel counter;
    private int count;

    public TestMouse() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                DefaultTableModel model = new DefaultTableModel(
                        new Object[]{"A", "B", "B", "B", "B", "B", "B"},
                        10
                );
                JTable table = new JTable(model);
                counter = new JLabel("0");

                final JPopupMenu popupMenu = new JPopupMenu();
                JMenuItem viewProfile = new JMenuItem("View Profile");
                viewProfile.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                    }
                });
                popupMenu.add(viewProfile);
                table.setComponentPopupMenu(popupMenu);
                table.addMouseListener(new MouseAdapter() {

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        System.out.println("clicked");
                        count++;
                        counter.setText(String.valueOf(count));
                    }

                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(counter, BorderLayout.NORTH);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

A actual runnable example that demonstrates your problem would involve less guess work and better responses




回答2:


I had exactly the same problem when closing JMenuBar popups, and this worked for me:

UIManager.put("PopupMenu.consumeEventOnClose", false);


来源:https://stackoverflow.com/questions/23505541/swing-mouse-click-event-for-jmenu-and-jpopupmenu

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!