JMenu和JPopupMenu的摆动鼠标单击事件 [英] Swing Mouse Click Event for JMenu and JPopupMenu

查看:78
本文介绍了JMenu和JPopupMenu的摆动鼠标单击事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望Eclipse在Swing的菜单和弹出菜单之外的鼠标单击具有行为.基本上,在Eclipse中,当您在菜单外按下鼠标时,菜单消失,并且鼠标按下事件会转发到您用鼠标单击的组件上.

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.

令人烦恼的是,Swing并没有这样做,而且我也找不到解决之道.

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

现在,即使使用Windows LAF,我也必须再次单击以获取该组件来注册鼠标单击.

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);

这是一个测试代码.我认为向每个简单的组件添加鼠标侦听器并不方便,因此它们可以在弹出菜单之后注册鼠标单击.在下面的示例中,表格确实实现了它,但按钮没有实现.

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);
         }
      });
   }

}

推荐答案

我似乎无法复制该问题.

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

当我右键单击表格时,会出现弹出菜单,当我再次单击表格(以消除弹出窗口)时,会触发mouseClicked事件.

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

这篇关于JMenu和JPopupMenu的摆动鼠标单击事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆