3

2 つのポップアップ メニューを持つシステム トレイ アイコンを作成しようとしています。1 つはマウスの左ボタンで、もう 1 つは右ボタンで呼び出す必要があります。AWT は PopupMenu を作成する簡単な方法を提供しますが、非表示の JFrame などを作成しないと、マウスの左ボタンでメニューを呼び出すことはできません。それで、swing JPopupMenu はどのマウス ボタンでも呼び出すことができることがわかりました。しかし、JPopupMenu には、JPopupMenu の外でマウスを押しても隠れないというバグがあります (これが本当にバグなのか、Java が苦手なのかはわかりません)。マウス リスナーの関数 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);




}
4

2 に答える 2

0

非常に有益な会話をありがとう, しかし、私はいくつかの単語を追加する必要があります:

menuItems を追加JPopupMenuすると、予期しない動作をすることがあります (マウスオーバーしても閉じられません)。

この場合、メニュー項目からマウス モーション リスナーを削除する必要があります。

JMenuItem jmi1 = new JMenuItem("JMenuItem1");

jmi1.removeMouseMotionListener(jmi1.getMouseMotionListeners()[0]);
jmi1.removeMouseListener(jmi1.getMouseListeners()[0]);
于 2016-08-31T19:08:40.033 に答える