【发布时间】:2021-09-18 17:23:43
【问题描述】:
我使用JPopupMenu作为SystemTray弹出菜单但第一个问题是如何确定放置弹出菜单的最安全位置?
第二个 如何或何时停止显示弹出菜单? 我看到了this 的帖子,但我看不懂代码。
这是我的示例代码:
import java.awt.AWTException;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
public class SampleTrayIcon implements MouseListener, MouseMotionListener {
/**
* System Tray
*/
private final SystemTray tray = SystemTray.getSystemTray();
/**
* Note Tray icon
*/
private final TrayIcon trayIcon;
/**
* Note Tray icon popup menu
*/
private final JPopupMenu popUpMenu = new JPopupMenu();
/**
* constructor
*/
public SampleTrayIcon() {
// check system tray is supported
if (!SystemTray.isSupported()) {
System.err.println("System tray is not supported");
System.exit(1);
}
// Create a TrayIcon image
BufferedImage image = null;
// try to read image from resources
try {
image = ImageIO.read(new URL("https://i.stack.imgur.com/lM3aS.png"));
} catch (Exception e) {
System.err.println("Failed to read image from resources");
System.exit(1);
}
// Create a TrayIcon
trayIcon = new TrayIcon(image, "QuickNote");
// set icon auto resize
trayIcon.setImageAutoSize(true);
// Create Menu items
var viewOnHover = new JCheckBoxMenuItem("onHover");
var aboutMenuItem = new JMenuItem("About");
var exitMenuItem = new JMenuItem("Exit");
// add Menuitems to PopUpMenu
popUpMenu.add(viewOnHover);
popUpMenu.addSeparator();
popUpMenu.add(aboutMenuItem);
popUpMenu.add(exitMenuItem);
// add mouse listener to tray icon
trayIcon.addMouseListener(this);
trayIcon.addMouseMotionListener(this);
// add tray to system
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println("TrayIcon could not be added to system tray");
System.exit(1);
}
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
if(SwingUtilities.isRightMouseButton(e)) {
System.out.println(e.getPoint());
popUpMenu.setLocation(e.getPoint());
popUpMenu.setInvoker(popUpMenu);
popUpMenu.setVisible(true);
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
new SampleTrayIcon();
}
}
完整回购请访问Github
上面的输出如下
第一个,我需要一些建议来创建一个算法来将 Jpopupmenu 放置在正确的位置这也有助于将未装饰的 UTILITY JFrame 放置在托盘图标附近。
第二个是 Jpopupmenu 在放置到位置后应该如何或何时设置为 false。
【问题讨论】:
-
@C0der 感谢您的回复,我已添加 github repo。期待您的回复
-
我希望没关系,如果不是请告诉我,以便我可以从头开始创建另一个代码来重现相同的问题
-
minimal reproducible example 应该与不在 github 上的问题一起发布。
-
@camickr 我现在已经编辑了代码,请你现在看看。谢谢
标签: java swing system-tray jpopupmenu