Skip to content

4.4版,系统托盘无法弹出菜单项问题 #230

@AaronJP

Description

@AaronJP

HI,你好

在windows11下,当我使用dorkbox.SystemTray4.4时,点击系统托盘图标,无法正常弹出系统托盘菜单。

我是在windows11下
java version "23.0.2" 2025-01-21
Java(TM) SE Runtime Environment (build 23.0.2+7-58)
Java HotSpot(TM) 64-Bit Server VM (build 23.0.2+7-58, mixed mode, sharing)

同样的代码,当我切换到dorkbox.SystemTray4.1时,就可以正常弹出显示托盘菜单。
以下是我的测试代码类。


package BibleLight.TR;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.InputStream;

import dorkbox.systemTray.Menu;
import dorkbox.systemTray.MenuItem;
import dorkbox.systemTray.SystemTray;

/**
 * 简化版系统托盘测试类
 */
public class SimpleTrayTest {
    
    public static void main(String[] args) {
        System.out.println("=== 简化版系统托盘测试 ===");
        
        try {
            // 配置 SystemTray 参数
            SystemTray.DEBUG = true;
            SystemTray.AUTO_SIZE = true;
            
            // 获取系统托盘实例
            SystemTray systemTray = SystemTray.get();
            
            if (systemTray == null) {
                System.err.println("无法获取系统托盘实例!");
                return;
            }
            
            System.out.println("成功获取系统托盘,类型: " + systemTray.getType());
            
            // 设置图标
            systemTray.setImage(createSimpleIcon());
            systemTray.setTooltip("测试托盘");
            systemTray.setStatus("测试中");
            
            // 获取菜单
            Menu menu = systemTray.getMenu();
            
            if (menu == null) {
                System.err.println("无法获取菜单!");
                return;
            }
            
            // 添加菜单项
            MenuItem testItem = new MenuItem("测试菜单项", e -> {
                System.out.println("测试菜单项被点击");
            });
            menu.add(testItem);
            
            // 添加退出菜单项
            MenuItem exitItem = new MenuItem("退出", e -> {
                System.out.println("退出程序");
                systemTray.shutdown();
                System.exit(0);
            });
            menu.add(exitItem);
            
            System.out.println("菜单创建完成,请点击系统托盘图标测试");
            System.out.println("程序将运行30秒...");
            
            // 保持程序运行
            Thread.sleep(30000);
            
            // 清理资源
            systemTray.shutdown();
            
        } catch (Exception e) {
            System.err.println("测试过程中发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 创建一个简单的彩色图标
     */
    private static BufferedImage createSimpleIcon() {
        int size = 16;
        BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = image.createGraphics();
        
        // 设置抗锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        // 绘制蓝色圆形背景
        g2d.setColor(Color.BLUE);
        g2d.fillOval(0, 0, size, size);
        
        // 绘制白色文字"T"
        g2d.setColor(Color.WHITE);
        g2d.setFont(new Font("Arial", Font.BOLD, 12));
        FontMetrics fm = g2d.getFontMetrics();
        int x = (size - fm.stringWidth("T")) / 2;
        int y = (size - fm.getHeight()) / 2 + fm.getAscent();
        g2d.drawString("T", x, y);
        
        g2d.dispose();
        return image;
    }
}

运行后控制台信息如下:

=== 简化版系统托盘测试 ===
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
成功获取系统托盘,类型: WindowsNative
菜单创建完成,请点击系统托盘图标测试
程序将运行30秒...


dorkbox.SystemTray4.4版在manjaro和Ubuntu下都能正常显示使用。

谁能帮我解释下问题出在了哪里?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions