java如何让托盘闪动_java – 如何将东西添加到系统托盘并添加mouseOver()功能?...

对不起,如果标题含糊不清,但这正是我想要实现的.

这是图标化/最小化的电池保护软件.将鼠标悬停在图标上时,您将看到图片中显示的窗口.

如何在Java中实现?

解决方法:

这使用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);

}

}

});

}

}

}

更新了鼠标支持

因为我无法抗拒…

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 lstDevices = new ArrayList(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,swing,mouseevent,mouseover,system-tray

来源: https://codeday.me/bug/20190718/1493962.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值