java - 在java中动态更新SystemTray

标签 java swing system-tray jpopupmenu

是否可以在 java 中将项目添加到 SystemTray 中的 PopUpMenu?我试图将项目添加到菜单中,但没有用。添加它并调用 TrayIcon.setPopMenu(PopUpMenu) 和之后的 SystemTray.add(TrayIcon) 方法也没有。有什么建议吗?

最佳答案

当然可以。

看我做的这个例子:

enter image description here

import java.awt.AWTException;
import java.awt.CheckboxMenuItem;
import java.awt.Image;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class Test {

    public Test() throws Exception {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new Test();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    private void initComponents() throws Exception {

        createAndShowTray();

    }

    private void createAndShowTray() throws Exception {

        //Check the SystemTray is supported
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }

        PopupMenu popup = new PopupMenu();
        //retieve icon form url and scale it to 32 x 32
        final TrayIcon trayIcon = new TrayIcon(ImageIO.read(
                new URL("http://www.optical-illusions.in/illusions/blue_rotation_optical_illusion.jpg"))
                .getScaledInstance(32, 32, Image.SCALE_SMOOTH), null);

        //get the system tray
        final SystemTray tray = SystemTray.getSystemTray();

        // Create a pop-up menu components
        MenuItem aboutItem = new MenuItem("About");
        aboutItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                JOptionPane.showMessageDialog(null, "About");
            }
        });

        final  CheckboxMenuItem cb1 = new CheckboxMenuItem("Set tooltip");
        cb1.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent ie) {
                if(cb1.getState()==true) {
                trayIcon.setToolTip("Hello, world");
                }else {
                trayIcon.setToolTip("");
                }
            }
        });

        Menu displayMenu = new Menu("Display");
        MenuItem infoItem = new MenuItem("Info");

        MenuItem exitItem = new MenuItem("Exit");
        //add actionlistner to exit menu item
        exitItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                System.exit(0);
            }
        });

        //Add components to pop-up menu
        popup.add(aboutItem);
        popup.addSeparator();
        popup.add(cb1);
        popup.addSeparator();
        popup.add(displayMenu);
        displayMenu.add(infoItem);
        popup.add(exitItem);

        trayIcon.setPopupMenu(popup);

        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.out.println("TrayIcon could not be added.");
        }
    }
}

引用资料:

关于java - 在java中动态更新SystemTray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219624/

相关文章:

java - ObjectOutputSteam 在接收之前发送多个对象

java - 尝试从 Spring Boot 创建 SWING/AWT 框架时由 : java. awt.HeadlessException 引起

java - 如何编写多线程代码来加速繁重的重复性任务?

c# - 将任何程序最小化到系统托盘

windows - 当应用程序失去焦点时,Qt 系统托盘上下文菜单仍然存在

java - 在继承层次结构中使用类型转换?

java - 倒带迭代器

java以随机顺序读取文本文件列标题

java - 从java程序调用C编译器

插入 USB 设备时启动的 .net 系统托盘应用程序