`
kayo
  • 浏览: 558031 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

Java的SystemTray类的使用方法

阅读更多

Java的SystemTray类的使用方法

JDK1.6版增加了java.awt.SystemTray类,该类表示桌面的系统托盘,这对大多数系统托盘应用已经足够。如果这个类还是不能满足您的需求,可以试一试JDIC (JDesktop Integration Components)。
JDK1.6的API文档,给出了这个类的用法。有人愿意把创建系统托盘的代码直接放在主应用代码中,笔者更倾向于把创建系统托盘的责任分派给一个单独的类,这符合类的设计原则。在主应用中直接调用该类的工厂方法就可以了,结构清晰,便于维护,改动或增加系统托盘的功能,不必改动主应用代码。
创建系统托盘的类(TrayFactory.java)的代码如下:

//package com.jnmc.liang.systemtray;

import java.awt.*;
import java.awt.event.*;

public class TrayFactory {
        private TrayIcon trayIcon = null;
        private Component comp = null;
        private String trayImageName = null;
        private String tooltip = null;
        
        private TrayFactory(Component comp, String trayImageName, String tooltip) {
                this.comp = comp;
                this.trayImageName = trayImageName;
                this.tooltip = tooltip;
               
                init();
        }
        
        private void init() {
                if (SystemTray.isSupported()) {
                        SystemTray tray = SystemTray.getSystemTray();
                        Image image  = Toolkit.getDefaultToolkit().getImage(trayImageName);
                        PopupMenu popupMenu = new PopupMenu();
                        MenuItem restoreItem = new MenuItem("还原");
                        MenuItem exitItem  = new MenuItem("退出");
                        
                        restoreItem.addActionListener(new RestoreItemActionListener());                        
                        exitItem.addActionListener(new ExitItemActionListener());
                        
                        popupMenu.add(restoreItem);
                        popupMenu.addSeparator();
                        popupMenu.add(exitItem);
                        
                        trayIcon = new TrayIcon(image, tooltip,  popupMenu);
                        trayIcon.addMouseListener(new TrayIconMouseListener());
                        //trayIcon.addActionListener(new TrayIconActionListener());
                                                
                        try {
                                tray.add(trayIcon);
                        }
                        catch (AWTException e) {
                                System.err.println(e);
                        }
                }
                else {
                        //..........
                }
        }

        private class RestoreItemActionListener implements ActionListener {
                public void actionPerformed(ActionEvent ae) {
                        comp.setVisible(true);
                }
        }
               
        private class ExitItemActionListener implements ActionListener {
                public void actionPerformed(ActionEvent ae) {
                        System.exit(0);
                }
        }
        
        private class TrayIconMouseListener extends MouseAdapter {
                public void mousePressed(MouseEvent me) {
                        if (me.getButton() == MouseEvent.BUTTON1) {
                                comp.setVisible(true);
                        }
                }
        }
/*
        private class TrayIconActionListener implements ActionListener {
                public void actionPerformed(ActionEvent ae) {
                        comp.setVisible(true);
                }
        }
*/
        public static void createTray(Component comp, String trayImageName, String tooltip) {
                new TrayFactory(comp, trayImageName, tooltip);
        }
}

这个类的构造方法是private的,因为创建该类的实例不是我们的目的,另一方面是为了方便系统托盘的创建。
构造方法有3个参数:
第1个参数是一个Component,这就是您所要显示或隐藏的主窗体。当然,您把这个参数写成Component的子类也无妨,这里是为了增加类的通用性。
第2个参数是一个String,它是一个image文件的名称,将来用这个文件创建托盘图标TrayIcon。
第3个参数也是一个String,它是工具提示字符串,当您把鼠标放到托盘图标上的时候,托盘图标将弹出这个字符串的内容。
创建系统托盘的具体代码在方法private void init()中。
创建系统托盘的任务分为两个步骤:
首先创建托盘图标(TrayIcon),其次把托盘图标添加到系统托盘(SystemTray)中。
Java.awt.TrayIcon提供3种构造方法创建TrayIcon实例,这里采用第三种构造方法:
                trayIcon = new TrayIcon(image, tooltip,  popupMenu);
其中,image对象由TrayFactory类构造方法的第二个参数trayImageName创建:
Image image  = Toolkit.getDefaultToolkit().getImage(trayImageName);
tooltip就是TrayFactory类构造方法的第三个参数
由于不能朝前引用,PopupMenu对象popupMenu必须在创建trayIcon对象之前创建,并给popup菜单项添加动作监听器来处理菜单项的动作(点击)事件,由于处理动作事件比较简单,这里不做具体分析,只对TrayIcon的鼠标事件做出说明。
我们希望在托盘图标上按下鼠标左键时显示主窗体,所以必须处理托盘图标的鼠标按下事件。我们用TrayIconMouseListener私有内部类(private inner class)来处理鼠标按下事件。不论按下鼠标左键还是右键,都会产生鼠标事件,都会引起mousePressed方法的调用,所以在这个方法中只处理左键而忽略右键,把右键留给popup菜单:
                        if (me.getButton() == MouseEvent.BUTTON1) {
                                comp.setVisible(true);
                        }
这时,就可以给init()方法中创建的TrayIcon对象trayIcon添加鼠标监听器了:
trayIcon.addMouseListener(new TrayIconMouseListener());
利用TrayFactory类对主应用创建系统托盘时,只需在主应用中调用该类的工厂方法即可:
TrayFactory.createTray(comp, trayImageName, tooltip);
注意这一句,一定要放在适当的位置:主应用从开始启动到启动完毕,必须有机会执行这一句。所以建议把这一句放在主应用的构造方法中,或者干脆放在显示主窗体的前一个语句的位置:

//其他语句
               JFrame mainFrame = new JFrame("测试主窗体");
                mainFrame.getContentPane().add(otherVisibleObj, BorderLayout.CENTER);
                mainFrame.pack();
                TrayFactory.createTray(mainFrame, "images/icon.png", "这是工具提示");        
                mainFrame.setVisible(true);
下面给出一个完整的例子。
主应用(MainApp.java)源代码如下:

import java.awt.*;
import javax.swing.*;

public class MainApp {
        private static void createAndShowGUI() {
                JFrame mainFrame = new JFrame("测试主窗体");
                JLabel jLabel = new JLabel("这是一个标签", SwingConstants.CENTER);
                jLabel.setPreferredSize(new Dimension(400, 300));
    mainFrame.getContentPane().add(jLabel, BorderLayout.CENTER);
   
                mainFrame.pack();
                TrayFactory.createTray(mainFrame, "images/icon.png", "你好,Java!\nHello,Java!");
                mainFrame.setVisible(true);
        }
   
        public static void main(String[] args) {
                String lf = UIManager.getSystemLookAndFeelClassName();
                try {
                        UIManager.setLookAndFeel(lf);
                }
                catch(Exception e) {
                }
               
                javax.swing.SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                        createAndShowGUI();
                                }
    });
        }   
}

为简单起见,可以把TrayFactory.java和MainApp.java放在同一目录下,把icon.png文件放在当前目录的images目录下。
分享到:
评论

相关推荐

    SystemTray

    `SystemTray`是Java AWT(Abstract Window Toolkit)库中的一个类,它提供了一个接口来管理系统的托盘区域,允许应用程序在系统托盘中创建和维护图标,从而与用户进行交互。 在Windows系统中,这个功能通常被称为...

    JavaFX+Jfoenix 学习笔记(十)--系统托盘及解决中文乱码问题源码

    JavaFX并不直接支持系统托盘功能,但我们可以借助Java的`java.awt.SystemTray`类来实现这一功能。当用户点击应用程序的关闭按钮时,我们不会立即退出程序,而是将窗口最小化到系统托盘。以下是一个简单的实现步骤: ...

    Java最小化到托盘的方法

    本文将详细介绍如何利用Java AWT包中的`SystemTray`类以及`TrayIcon`类来实现这一功能。 #### 一、理解`SystemTray`与`TrayIcon` 在Java中,`SystemTray`类是系统托盘的抽象表示,而`TrayIcon`则是放置在托盘中的...

    java实现系统托盘

    使用`SystemTray.getSystemTray()`方法获取系统托盘对象。 ```java SystemTray tray = SystemTray.getSystemTray(); ``` 4. **创建图标**: 创建一个`ImageIcon`对象,使用你想要显示的图像,并用它来创建`...

    JAVA6.0的新特性

    其中,最显著的两个新特性当属`Desktop`类和`SystemTray`类的加入,它们使得Java应用能够更加无缝地集成到桌面环境中,提供了与操作系统更深层次的交互能力。 ### `Desktop`类 `Desktop`类是JDK 6中新增的一个类,...

    java实现360悬浮球

    7. **系统托盘**: Java提供SystemTray类来处理系统托盘功能。用户可以通过将悬浮球最小化到系统托盘,而不是关闭它。这需要实现TrayIcon类,并添加适当的监听器来处理点击事件。 8. **资源管理**: `icon`文件可能是...

    java编写的金山词霸

    总之,这段Java代码展示了如何使用Java Swing库和AWT工具类库创建一个具备基本GUI界面、事件响应能力以及系统托盘图标显示功能的词典应用。通过对这段代码的分析,我们不仅了解了Java GUI编程的基本框架,还学习了...

    java 托盘小例子

    这个类是`java.awt.SystemTray`类的一部分,后者代表了系统的托盘区域。 2. **系统托盘的使用** 在Java程序中使用系统托盘首先需要检查系统是否支持该功能,因为不是所有操作系统都提供托盘区域。可以通过`...

    JAVA实现托盘功能

    在Java中,我们可以通过`SystemTray`类来检查是否支持托盘功能: ```java import java.awt.SystemTray; import java.awt.Toolkit; public class TrayDemo { public static void main(String[] args) { if (!...

    javaQQ实现托盘的小例子

    本文将详细解析如何在Java中利用`java.awt.SystemTray`类实现托盘功能,并通过一个具体示例——JavaQQ实现托盘功能的过程来深入理解其工作原理。 #### 核心知识点:Java SystemTray API `java.awt.SystemTray`是...

    java 实现托盘 显示图标小应用

    首先,我们需要引入Java的`javax.swing.SystemTray`和`javax.swing.TrayIcon`类,这两个类是实现托盘功能的关键。`SystemTray`代表了操作系统的系统托盘区域,而`TrayIcon`则表示托盘中的图标及其关联的操作。 1. *...

    java实现托盘处理

    这通常涉及到`java.awt.TrayIcon`和`java.awt.Toolkit`这两个类。`TrayIcon`是用于创建托盘图标的核心类,而`Toolkit`则提供了获取系统托盘实例的方法。 ```java import java.awt.TrayIcon; import java.awt....

    Java代码生成系统托盘图标

    下面将详细讲解如何使用Java代码生成系统托盘图标。 首先,你需要导入必要的Java库: ```java import java.awt.*; import javax.swing.*; ``` Java AWT中的`TrayIcon`类是用于创建系统托盘图标的对象。在使用之前...

    java系统托盘 java 系统托盘 系统托盘 java 系统托盘java java任务栏 java 任务栏 任务栏java 任务栏 java 源代码

    1. 检查系统是否支持系统托盘:使用`SystemTray`类的静态方法`getSystemTray()`,如果返回`null`,则表示当前系统不支持系统托盘。 ```java if (SystemTray.isSupported()) { SystemTray tray = SystemTray....

    Java系统托盘 Java系统托盘

    在Java中,`SystemTray` 类代表了系统的托盘区域,而 `TrayIcon` 类则表示托盘区域中的图标及其关联的操作。我们首先需要检查系统是否支持系统托盘,因为并非所有操作系统都提供这个功能: ```java if (SystemTray....

    JAVA系统托盘图标控制程序

    这可以通过`java.awt.SystemTray`类的静态方法`isSupported()`来检查。 2. **获取系统托盘实例**:如果支持,我们可以调用`SystemTray.getSystemTray()`获取唯一的系统托盘实例。 3. **创建图标**:加载图像资源...

    一个完整系统托盘(java)

    在Java中,首先需要检查当前系统是否支持系统托盘,这可以通过`SystemTray`类的静态方法`isSupported()`来判断。如果支持,可以通过`SystemTray.getSystemTray()`获取系统托盘实例,然后使用`add(TrayIcon)`方法将`...

    java实现托盘、气泡程序源码

    你可以通过`java.awt.SystemTray`类的静态方法`isSupported()`来检查是否支持系统托盘。如果支持,可以通过`getSystemTray()`获取系统托盘实例。 2. **创建TrayIcon对象**: 创建一个`TrayIcon`对象,需要提供一个...

    java常用代码

    3. **系统托盘的应用**:Java允许程序创建系统托盘图标,这通常涉及到`java.awt.SystemTray`和`java.awt.TrayIcon`类的使用。这部分代码可能展示了如何在任务栏创建一个图标,并响应用户点击事件。 4. **哈弗曼编码...

Global site tag (gtag.js) - Google Analytics