gpt4 book ai didi

java - 如何将东西添加到系统托盘并添加 mouseOver() 功能?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:35 24 4
gpt4 key购买 nike

enter image description here

抱歉,如果标题含糊不清,但这就是我要实现的。
这是图标化/最小化的 Battery Care 软件。当您将鼠标悬停在该图标上时,您会看到图片中显示的窗口。
如何用 Java 实现?

最佳答案

enter image description here

这使用 JPopupMenu 在点击时显示信息,这不是最推荐的方法,因为很难布局其他组件...但是您可以轻松地使用 JWindow 而不是...

public class SystemTrayTest {

public static void main(String[] args) {
if (SystemTray.isSupported()) {

EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
try {
final JPopupMenu popup = new JPopupMenu();
popup.add(new JLabel("Charging (45%)", JLabel.CENTER));

popup.add(new JLabel("Charging", new ImageIcon(ImageIO.read(SystemTrayTest.class.getResource("/battery_connection.png"))), JLabel.LEFT));
popup.add(new JLabel("Power Saver", new ImageIcon(ImageIO.read(SystemTrayTest.class.getResource("/flash_yellow.png"))), JLabel.LEFT));

popup.add(new JSeparator());

JMenuItem exitMI = new JMenuItem("Exit");
exitMI.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
popup.add(exitMI);

TrayIcon trayIcon = new TrayIcon(ImageIO.read(SystemTrayTest.class.getResource("/battery_green.png")), "Feel the power");
trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
popup.setLocation(e.getX(), e.getY());
popup.setInvoker(popup);
popup.setVisible(true);
}
});
SystemTray.getSystemTray().add(trayIcon);
} catch (Exception ex) {
ex.printStackTrace();
System.exit(0);
}

}
});
}

}
}

更新了鼠标悬停支持

因为我无法抗拒玩...

enter image description here

public class SystemTrayTest {

public static void main(String[] args) {
new SystemTrayTest();
}

public SystemTrayTest() {
if (SystemTray.isSupported()) {

EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
try {
TrayIcon trayIcon = new TrayIcon(ImageIO.read(SystemTrayTest.class.getResource("/battery_green.png")), "Feel the power");
MouseHandler mouseHandler = new MouseHandler();
trayIcon.addMouseMotionListener(mouseHandler);
trayIcon.addMouseListener(mouseHandler);
SystemTray.getSystemTray().add(trayIcon);
} catch (Exception ex) {
ex.printStackTrace();
System.exit(0);
}
}
});
}
}

public class MouseHandler extends MouseAdapter {

private Timer popupTimer;
private JWindow popup;
private Point point;

public MouseHandler() {
popup = new JWindow();
((JComponent)popup.getContentPane()).setBorder(new LineBorder(Color.LIGHT_GRAY));
popup.setLayout(new GridLayout(0, 1));
popup.add(new JLabel("Charging (45%)", JLabel.CENTER));

try {
popup.add(new JLabel("Charging", new ImageIcon(ImageIO.read(getClass().getResource("/battery_connection.png"))), JLabel.LEFT));
popup.add(new JLabel("Power Saver", new ImageIcon(ImageIO.read(getClass().getResource("/flash_yellow.png"))), JLabel.LEFT));
} catch (IOException exp) {
exp.printStackTrace();
}
popup.pack();

popupTimer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (point != null) {
System.out.println(point);
Rectangle bounds = getScreenViewableBounds(point);
int x = point.x;
int y = point.y;
if (y < bounds.y) {
y = bounds.y;
} else if (y > bounds.y + bounds.height) {
y = bounds.y + bounds.height;
}
if (x < bounds.x) {
x = bounds.x;
} else if (x > bounds.x + bounds.width) {
x = bounds.x + bounds.width;
}

if (x + popup.getWidth() > bounds.x + bounds.width) {
x = (bounds.x + bounds.width) - popup.getWidth();
}
if (y + popup.getWidth() > bounds.y + bounds.height) {
y = (bounds.y + bounds.height) - popup.getHeight();
}
popup.setLocation(x, y);
popup.setVisible(true);
}
}
});
popupTimer.setRepeats(false);

}

@Override
public void mouseExited(MouseEvent e) {
System.out.println("Stop");
point = null;
popupTimer.stop();
popup.setVisible(false);
}

@Override
public void mouseMoved(MouseEvent e) {
popupTimer.restart();
point = e.getPoint();
}

@Override
public void mouseClicked(MouseEvent e) {
System.exit(0);
}
}

public static GraphicsDevice getGraphicsDeviceAt(Point pos) {

GraphicsDevice device = null;

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice lstGDs[] = ge.getScreenDevices();

ArrayList<GraphicsDevice> lstDevices = new ArrayList<GraphicsDevice>(lstGDs.length);

for (GraphicsDevice gd : lstGDs) {

GraphicsConfiguration gc = gd.getDefaultConfiguration();
Rectangle screenBounds = gc.getBounds();

if (screenBounds.contains(pos)) {

lstDevices.add(gd);

}

}

if (lstDevices.size() == 1) {

device = lstDevices.get(0);

}

return device;

}

public static Rectangle getScreenViewableBounds(Point p) {

return getScreenViewableBounds(getGraphicsDeviceAt(p));

}

public static Rectangle getScreenViewableBounds(GraphicsDevice gd) {

Rectangle bounds = new Rectangle(0, 0, 0, 0);

if (gd != null) {

GraphicsConfiguration gc = gd.getDefaultConfiguration();
bounds = gc.getBounds();

Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);

bounds.x += insets.left;
bounds.y += insets.top;
bounds.width -= (insets.left + insets.right);
bounds.height -= (insets.top + insets.bottom);

}

return bounds;

}
}

关于java - 如何将东西添加到系统托盘并添加 mouseOver() 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14371194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com