我正在尝试使用两个弹出菜单创建系统托盘图标,一个应该用鼠标左键调用,另一个用右键调用。 AWT提供了创建PopupMenu的简单方法,但是如果不使用不可见的JFrame或其他东西,用鼠标左键调用菜单是不可能的。因此,我发现可以通过任何鼠标按钮调用swing JPopupMenu。但是,当我在JPopupMenu外面按鼠标时,JPopupMenu有bug(我不知道这是不是真的是一个bug,或者我在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);
}
答案 0 :(得分:0)
拿一个鼠标监听器并分开左右键:
从
改变ti.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
jpm.setLocation(e.getX(), e.getY());
jpm.setInvoker(jpm);
jpm.setVisible(true);
}
}
});
到
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();
}
}
}
});
答案 1 :(得分:0)
感谢非常有用的对话,但我需要添加一些词语:
有时当您添加menuItem时,JPopupMenu
会以不可预测的方式运行(当您将鼠标悬停在鼠标上时,它不会关闭)。
在这种情况下,您需要从菜单项中删除鼠标移动侦听器
JMenuItem jmi1 = new JMenuItem("JMenuItem1");
jmi1.removeMouseMotionListener(jmi1.getMouseMotionListeners()[0]);
jmi1.removeMouseListener(jmi1.getMouseListeners()[0]);