【问题标题】:Hiding my program in the System Tray in Windows在 Windows 的系统托盘中隐藏我的程序
【发布时间】:2011-09-27 15:13:47
【问题描述】:

我希望我的程序在 Windows 时钟附近的任务栏状态区域中显示一个图标,并找到了这样做的方法。

问题是,如果在窗口上按下“X”,我希望我的程序在状态区域中保持打开状态,而不是在系统托盘中,但我不知道如何执行此操作并继续搜索谷歌没有帮助(我可能没有搜索正确的术语)。

编辑:我认为我使用了错误的术语。我知道如何在通知区域中显示我的程序图标,我希望将其隐藏在最小化窗口时通常显示的区域中。

【问题讨论】:

  • 系统托盘的正式名称是通知区(见here)。这可能有助于您的搜索。
  • @user786653 有趣的是,即使 Java 实现在名称系统托盘下。这是 raymond 和 co 刚刚输掉的一场战斗——连同他们的官方指南如何使用它(这是 imo 的一件好事~)
  • Voo:Java 实现可在更多系统上运行,而不仅仅是 Windows,其他窗口管理器采用术语»系统托盘« ...

标签: java windows swing system-tray


【解决方案1】:

我知道如何在通知区域中显示我的程序图标,我希望将其隐藏在最小化窗口时通常显示的区域中。

那就不要使用系统托盘了。

问题是,如果在窗口上按下“X”,我希望我的程序在状态区域中保持打开状态,

frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

【讨论】:

  • 谢谢。我没有看正确的方法。我想我应该想到通过让它不可见它会隐藏它。
【解决方案2】:

JavaSE v 6 中添加了系统托盘支持。

您可以在此处查看示例 http://download.oracle.com/javase/7/docs/api/java/awt/SystemTray.html

【讨论】:

    【解决方案3】:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.UIManager;
    
    public class HideToSystemTray extends JFrame {
        TrayIcon trayIcon;
        SystemTray tray;
        JButton button;
    
        HideToSystemTray() {
            super("SystemTray test");
            button = new JButton("Press");
            button.setBounds(10, 10, 40, 40);
            setUndecorated(true);
            getContentPane().add(button);
            System.out.println("creating instance");
            try {
                System.out.println("setting look and feel");
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                System.out.println("Unable to set LookAndFeel");
            }
            if (SystemTray.isSupported()) {
                System.out.println("system tray supported");
                tray = SystemTray.getSystemTray();
    
                Image image = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Sandipan\\Desktop\\cutter.png");
                ActionListener exitListener = new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Exiting....");
                        System.exit(0);
                    }
                };
                PopupMenu popup = new PopupMenu();
                MenuItem defaultItem = new MenuItem("Exit");
                defaultItem.addActionListener(exitListener);
                popup.add(defaultItem);
                defaultItem = new MenuItem("Open");
                defaultItem.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        tray.remove(trayIcon);
                        setVisible(true);
                        System.out.println("Tray icon removed");
                    }
                });
                popup.add(defaultItem);
                trayIcon = new TrayIcon(image, "SystemTray Demo", popup);
                trayIcon.setImageAutoSize(true);
            } else {
                System.out.println("system tray not supported");
            }
    
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //Execute when button is pressed
                    System.out.println("You clicked the button");
                    try {
                        tray.add(trayIcon);
                        setVisible(false);
                        System.out.println("added to SystemTray");
                    } catch (AWTException ex) {
                        System.out.println("unable to add to tray");
                    }
                }
            });
    
    
        /*  addWindowStateListener(new WindowStateListener() { 
        public void windowStateChanged(WindowEvent e) { 
            if(e.getNewState()==ICONIFIED){ 
                try { 
                    tray.add(trayIcon); 
                    setVisible(false); 
                    System.out.println("added to SystemTray"); 
                } catch (AWTException ex) { 
                    System.out.println("unable to add to tray"); 
                } 
            } 
            if(e.getNewState()==7){ 
                try{ 
                    tray.add(trayIcon); 
                    setVisible(false); 
                    System.out.println("added to SystemTray"); 
                }catch(AWTException ex){ 
                    System.out.println("unable to add to system tray"); 
                } 
            } 
            if(e.getNewState()==MAXIMIZED_BOTH){ 
                tray.remove(trayIcon); 
                setVisible(true); 
                System.out.println("Tray icon removed"); 
            } 
            if(e.getNewState()==NORMAL){ 
                tray.remove(trayIcon); 
                setVisible(true); 
                System.out.println("Tray icon removed"); 
            } 
        } 
        }); */
        setIconImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\Sandipan\\Desktop\\cutter.png"));
    
        setVisible(true);
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public static void main(String[] args) {
        new HideToSystemTray();
    }
    }
    

    【讨论】:

    • 请添加一些有关代码的详细信息,以及为什么您注释掉了其中的大部分内容,以便其他人更容易理解
    【解决方案4】:

    我猜您希望在最小化主窗体时删除任务栏按钮。您可以通过将其可见属性设置为 false 来实现这一点,但是您可以使用 Java 框架来做到这一点。

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多