java - 制作一个真正弹出的 JPopupMenu

标签 java actionlistener

我有一个 JFrame,它看起来像一个典型的聊天框。为了连接和断开与服务器的连接,我实现了一个 JPopupMenu 并向主窗口添加了一个 MouseListener
但是弹出菜单不会出现。

主窗口中的各种 JComponent:

  • JScrollPane 内的 JTextArea
  • JTextField 输入消息
  • 发送按钮
  • JScrollPane 和一个 ArrayList 用于显示用户

  • 无论您右键单击何处,都会出现弹出窗口。无论是在 JTextArea 上还是在输入消息的字段上。
    我要向哪些组件添加监听器以及添加哪些监听器?

    代码

    变量:

        private static A_Chat_Client chatClient;
        public static String userName = "Anonymous";
    
    //------------------------------------------------------------------------------
        public static JFrame mainFrame = new JFrame();
        public static JTextArea textArea = new JTextArea(30,30);
        public static JScrollPane pane = new JScrollPane(textArea);
        public static JTextField message = new JTextField(10);
        public static JButton send = new JButton("Send");
    
        public static JPopupMenu popup = new JPopupMenu();
        public static JMenuItem connect = new JMenuItem("Connect");
        public static JMenuItem disconnect = new JMenuItem("Disconnect");
        public static JMenuItem help = new JMenuItem("Help");
    
        public static JList usersOnline = new JList();
        public static JScrollPane userPane = new JScrollPane(usersOnline);  
    

    主要方法

    public static void main(String[] args) {
            buildMainWindow();
            initialize();
            addListeners();
            popup.show(mainFrame, 0, 0); //forcefully popup
        }  
    

    addListeners()

    public static void addListeners(){
    
            mainFrame.addMouseListener(new MouseHandler());
    
            send.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e){
                    actionSend();
                }
            });
            connect.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e){
                    actionConnect();
                }
            });
            disconnect.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e){
                    actionDisconnect();
                }
            });
            help.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e){
                    actionHelp();
                }
            });
        }  
    

    MouseHandler 类

    private static class MouseHandler extends MouseAdapter{
            @Override
            public void mouseClicked(MouseEvent e){
                if(e.isPopupTrigger()){
                    popup.show(mainFrame, e.getX(), e.getY());
                }
            }
        }
    

    最佳答案

    您可以附加 AWTEventListener使用 Toolkit#addAWTEventListener 到主事件队列

    然后,您需要检查正在接收的事件类型,并检查它是否是弹出事件。

    enter image description here

    public class TestGlobalPopup {
    
        public static void main(String[] args) {
            new TestGlobalPopup();
        }
    
        public TestGlobalPopup() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            public TestPane() {
                Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
                    @Override
                    public void eventDispatched(AWTEvent event) {
                        if (event instanceof MouseEvent) {
                            MouseEvent me = (MouseEvent) event;
                            if (me.isPopupTrigger()) {
                                Component component = me.getComponent();
                                JPopupMenu popup = new JPopupMenu();
                                popup.add(new JLabel("Clicked on " + component.getClass().getName()));
                                popup.show(component, me.getX(), me.getY());
                            }
                        }
                    }
                }, AWTEvent.MOUSE_EVENT_MASK);
    
                setLayout(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
                add(new JLabel("Label: "), gbc);
                gbc.gridx++;
                add(new JTextField(10), gbc);
    
                gbc.gridy++;
                gbc.gridx = 0;
                gbc.gridwidth = 2;
                add(new JScrollPane(new JTextArea(5, 20)), gbc);
            }
    
        }
    
    }
    

    关于java - 制作一个真正弹出的 JPopupMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14330079/

    相关文章:

    Java:如何删除匿名 ActionListener?

    java - 在没有 NetBeans 的情况下构建 JavaFX 项目

    java - org.openqa.selenium.WebDriverException : unknown error: cannot focus element using ChromeDriver Selenium and Java

    java - ActionListener 阻止程序运行?

    java - 使用 JRadioButtons 更改 JTable 中的列不会刷新结构

    java - 让另一个类在 actionListener 中工作

    Java 附加 API : How to set agent properties?

    java - 使用数组覆盖 Java 泛型方法

    java - 如何在 Java 中播放 3gp 文件?

    java - 我正在使用操作监听器创建一个新的 JFrame,但无法更改背景颜色