JPopupMenu появляется, но не реагирует - PullRequest
1 голос
/ 05 августа 2020

У меня проблемы с правильной работой JPopupMenu.

Что я ожидаю

Меню должно появиться, как только я щелкну правой кнопкой мыши. Затем я могу выбрать элемент в меню и делать все, что захочу ..

Что я получаю

Меню появляется, когда я щелкаю правой кнопкой мыши, но после этого Я не могу выбрать пункт меню или, по крайней мере, мне не хватает хорошо известного эффекта выделения при наведении курсора мыши (я ожидал, что элемент, на который я сейчас наведен, будет выделен, как в обычном меню).

Проблема здесь (без выделения при наведении):

enter image description here

Here is my example code:

package com.mycompany.mavenproject2;

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

public class PopupMenuTest {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel pane = new JPanel();
        JPopupMenu popup = new JPopupMenu();
        
        popup.add(new JMenuItem("A"));
        popup.add(new JMenuItem("B"));
        
        pane.setSize(300,300);
        pane.add(popup);
        pane.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if(SwingUtilities.isRightMouseButton(e)) {
                    popup.setLocation(e.getXOnScreen(), e.getYOnScreen());
                    popup.setVisible(true);
                }
            }
         });
        
        frame.setTitle("Test");
        frame.add(pane);
        frame.setPreferredSize(new Dimension(300,300));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

Edit

Compare to a "normal" menu with working hovering:

enter image description here

Edit #2

Please see the current (unexpected) behaviour:

1 Ответ

0 голосов
/ 05 августа 2020

Вам нужно использовать метод JPopupMenu show, а не метод setVisible.

Вот код, с которым я тестировал. Я использую Windows 10 и использую Java JDK 13.0.2 с соответствием Java 8. Я выделяю курсор мыши.

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

public class JPopupMenuTest implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JPopupMenuTest());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame();

        JPanel pane = new JPanel();
        pane.setPreferredSize(new Dimension(300, 300));
        pane.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (SwingUtilities.isRightMouseButton(e)) {
                    JPopupMenu popup = new JPopupMenu();
                    popup.add(new JMenuItem("A"));
                    popup.add(new JMenuItem("B"));

                    popup.show(e.getComponent(), e.getX(), e.getY());
                }
            }
        });

        frame.setTitle("JPopupMenu Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(pane);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

}
...