Java jpopupmenu на mouseExited

Я пытаюсь создать значок на панели задач с двумя всплывающими меню, одно из которых должно вызываться левой кнопкой мыши, а другое - правой. AWT предлагает простой способ создания PopupMenu, но невозможно вызвать меню левой кнопкой мыши, не делая невидимым JFrame или что-то в этом роде. Итак, я узнаю, что качели JPopupMenu могут вызываться любой из кнопок мыши. Но у JPopupMenu есть ошибка (я не знаю, действительно ли это ошибка или я не так хорош в Java), которая не скрывается, когда я нажимаю мышь вне JPopupMenu. Я пытался использовать функцию прослушивателя мыши mouseExited, но она работает только на границе JPopupMenu. Если мышь покидает границу JPopupMenu, она скрывается, и я не могу нажать ни одну из кнопок JPopupMenu. Может быть, у кого-то была такая же проблема, и может помочь мне узнать, как заставить ее работать правильно.

public static JPopupMenu jpm;
public static TrayIcon ti;

public static void main(String args[]) throws IOException, AWTException,
        ClassNotFoundException, InstantiationException,
        IllegalAccessException, UnsupportedLookAndFeelException {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    SystemTray st = SystemTray.getSystemTray();
    Image icon = ImageIO.read(SipLogin.class
            .getResource("/resources/phone-yellow-small.png"));

    ti = new TrayIcon(icon, "Sip login", null);

    jpm = new JPopupMenu();

    JMenuItem jmi1 = new JMenuItem("JMenuItem1");
    JMenuItem jmi2 = new JMenuItem("JMenuItem2");
    JMenuItem jmi3 = new JMenuItem("JMenuItem3");
    JMenuItem jmi4 = new JMenuItem("JMenuItem4");



    ti.addMouseListener(new MouseAdapter() {
        public void mouseReleased(MouseEvent e) {
            if (e.isPopupTrigger()) {
                jpm.setLocation(e.getX(), e.getY());
                jpm.setInvoker(jpm);
                jpm.setVisible(true);
            }
        }
    });

    jpm.add(jmi1);
    jpm.add(jmi2);
    jpm.add(jmi3);
    jpm.add(jmi4);

    jpm.addMouseListener(new MouseAdapter() {
        public void mouseExited(MouseEvent e) {
            jpm.setVisible(false);
        }
    });

    st.add(ti);




}

person Algirdas    schedule 18.07.2013    source источник
comment
mKorbel, он хочет, чтобы отображалось только одно за раз, в зависимости от того, какая кнопка мыши нажата.   -  person predi    schedule 18.07.2013
comment
Я знаю, что только один JPopup может быть виден, но я не могу скрыть его, как PopupMenu, ведьма прячется, когда мышь нажимается где-то за пределами меню.   -  person Algirdas    schedule 18.07.2013
comment
Попробуйте этот поток, не уверен, что он удовлетворит ваше требование, но на всякий случай :-)   -  person nIcE cOw    schedule 18.07.2013
comment
Я бы использовал неукрашенный JDialog и таймер Swing, чтобы определить, когда мышь покинула его. Обратите внимание, что вы должны учитывать, что когда мышь входит в подкомпонент, она также покидает его родительский компонент! Вот почему mouseExited у тебя не работает..   -  person predi    schedule 18.07.2013
comment
Спасибо за ваши ответы. predi, но, возможно, можно добавить прослушиватель мыши для всех компонентов (компонент и его подкомпоненты). Это был бы самый простой способ заставить его работать как надо. Использование JDialogs и таймеров делает исходный код намного длиннее и труднее для понимания...   -  person Algirdas    schedule 18.07.2013
comment
Этот ответ также может помочь.   -  person predi    schedule 22.08.2013


Ответы (2)


Возьмите этот один прослушиватель мыши и разделите левый и правый щелчок:

Меняться от

ti.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
        if (e.isPopupTrigger()) {
            jpm.setLocation(e.getX(), e.getY());
            jpm.setInvoker(jpm);
            jpm.setVisible(true);
        }
    }
});

to

ti.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
        if(e.getclickCount < 2){
            if(e.getButton().equals(MouseEvent.Button1){
                showPopup1();
            }
            if(e.getButton().equals(MouseEvent.Button3){
                showPopup2();
            }
        }
    }
});
person gantners    schedule 22.01.2014

спасибо за очень полезный разговор, но мне нужно добавить несколько слов:

Иногда, когда вы добавляете элементы меню, JPopupMenu ведет себя непредсказуемым образом (он не закрывается, когда вы наводите на него указатель мыши).

В этом случае вам нужно удалить слушатели движения мыши из ваших пунктов меню.

JMenuItem jmi1 = new JMenuItem("JMenuItem1");

jmi1.removeMouseMotionListener(jmi1.getMouseMotionListeners()[0]);
jmi1.removeMouseListener(jmi1.getMouseListeners()[0]);
person Lord Nighton    schedule 31.08.2016