【问题标题】:How to hide a JFrame in system tray of taskbar如何在任务栏的系统托盘中隐藏 JFrame
【发布时间】:2011-11-19 15:52:21
【问题描述】:

我创建了一个JFrame,想把它隐藏在windows中的taskbar中,但是,它不应该在右下角可见,而是隐藏在tray menu items中。

谁能告诉我怎么做?
我需要对windows的系统设置进行一些更改吗?

例如,您可能已经看到一些download managersTeam Viewer4shared desktop 等隐藏在任务栏的托盘菜单项中。

【问题讨论】:

    标签: java windows jframe taskbar minimize


    【解决方案1】:

    检查文档中的 TryIconDemo。此链接包含一小段代码。复制并在您的 IDE 上运行它。

    https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/misc/TrayIconDemoProject/src/misc/TrayIconDemo.java

    /*
     * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     *   - Redistributions of source code must retain the above copyright
     *     notice, this list of conditions and the following disclaimer.
     *
     *   - Redistributions in binary form must reproduce the above copyright
     *     notice, this list of conditions and the following disclaimer in the
     *     documentation and/or other materials provided with the distribution.
     *
     *   - Neither the name of Oracle or the names of its
     *     contributors may be used to endorse or promote products derived
     *     from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    package misc;  
    /*
     * TrayIconDemo.java
     */
    
    import java.awt.*;
    import java.awt.event.*;
    import java.net.URL;
    import javax.swing.*;
    
    public class TrayIconDemo {
        public static void main(String[] args) {
            /* Use an appropriate Look and Feel */
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
            } catch (UnsupportedLookAndFeelException ex) {
                ex.printStackTrace();
            } catch (IllegalAccessException ex) {
                ex.printStackTrace();
            } catch (InstantiationException ex) {
                ex.printStackTrace();
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }
            /* Turn off metal's use of bold fonts */
            UIManager.put("swing.boldMetal", Boolean.FALSE);
            //Schedule a job for the event-dispatching thread:
            //adding TrayIcon.
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    
        private static void createAndShowGUI() {
            //Check the SystemTray support
            if (!SystemTray.isSupported()) {
                System.out.println("SystemTray is not supported");
                return;
            }
            final PopupMenu popup = new PopupMenu();
            final TrayIcon trayIcon =
                    new TrayIcon(createImage("images/bulb.gif", "tray icon"));
            final SystemTray tray = SystemTray.getSystemTray();
    
            // Create a popup menu components
            MenuItem aboutItem = new MenuItem("About");
            CheckboxMenuItem cb1 = new CheckboxMenuItem("Set auto size");
            CheckboxMenuItem cb2 = new CheckboxMenuItem("Set tooltip");
            Menu displayMenu = new Menu("Display");
            MenuItem errorItem = new MenuItem("Error");
            MenuItem warningItem = new MenuItem("Warning");
            MenuItem infoItem = new MenuItem("Info");
            MenuItem noneItem = new MenuItem("None");
            MenuItem exitItem = new MenuItem("Exit");
    
            //Add components to popup menu
            popup.add(aboutItem);
            popup.addSeparator();
            popup.add(cb1);
            popup.add(cb2);
            popup.addSeparator();
            popup.add(displayMenu);
            displayMenu.add(errorItem);
            displayMenu.add(warningItem);
            displayMenu.add(infoItem);
            displayMenu.add(noneItem);
            popup.add(exitItem);
    
            trayIcon.setPopupMenu(popup);
    
            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                System.out.println("TrayIcon could not be added.");
                return;
            }
    
            trayIcon.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null,
                            "This dialog box is run from System Tray");
                }
            });
    
            aboutItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null,
                            "This dialog box is run from the About menu item");
                }
            });
    
            cb1.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    int cb1Id = e.getStateChange();
                    if (cb1Id == ItemEvent.SELECTED){
                        trayIcon.setImageAutoSize(true);
                    } else {
                        trayIcon.setImageAutoSize(false);
                    }
                }
            });
    
            cb2.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    int cb2Id = e.getStateChange();
                    if (cb2Id == ItemEvent.SELECTED){
                        trayIcon.setToolTip("Sun TrayIcon");
                    } else {
                        trayIcon.setToolTip(null);
                    }
                }
            });
    
            ActionListener listener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    MenuItem item = (MenuItem)e.getSource();
                    //TrayIcon.MessageType type = null;
                    System.out.println(item.getLabel());
                    if ("Error".equals(item.getLabel())) {
                        //type = TrayIcon.MessageType.ERROR;
                        trayIcon.displayMessage("Sun TrayIcon Demo",
                                "This is an error message", TrayIcon.MessageType.ERROR);
    
                    } else if ("Warning".equals(item.getLabel())) {
                        //type = TrayIcon.MessageType.WARNING;
                        trayIcon.displayMessage("Sun TrayIcon Demo",
                                "This is a warning message", TrayIcon.MessageType.WARNING);
    
                    } else if ("Info".equals(item.getLabel())) {
                        //type = TrayIcon.MessageType.INFO;
                        trayIcon.displayMessage("Sun TrayIcon Demo",
                                "This is an info message", TrayIcon.MessageType.INFO);
    
                    } else if ("None".equals(item.getLabel())) {
                        //type = TrayIcon.MessageType.NONE;
                        trayIcon.displayMessage("Sun TrayIcon Demo",
                                "This is an ordinary message", TrayIcon.MessageType.NONE);
                    }
                }
            };
    
            errorItem.addActionListener(listener);
            warningItem.addActionListener(listener);
            infoItem.addActionListener(listener);
            noneItem.addActionListener(listener);
    
            exitItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    tray.remove(trayIcon);
                    System.exit(0);
                }
            });
        }
    
        //Obtain the image URL
        protected static Image createImage(String path, String description) {
            URL imageURL = TrayIconDemo.class.getResource(path);
    
            if (imageURL == null) {
                System.err.println("Resource not found: " + path);
                return null;
            } else {
                return (new ImageIcon(imageURL, description)).getImage();
            }
        }
    }
    

    【讨论】:

      【解决方案2】:
      import java.awt.*;
      import java.awt.event.*;
      import javax.swing.JFrame;
      import javax.swing.UIManager;
      
      /**
       *
       * @author Mohammad Faisal
       * ermohammadfaisal.blogspot.com
       * facebook.com/m.faisal6621
       *
       */
      
      public class HideToSystemTray extends JFrame{
          TrayIcon trayIcon;
          SystemTray tray;
          HideToSystemTray(){
              super("SystemTray test");
              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("/media/faisal/DukeImg/Duke256.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) {
                          setVisible(true);
                          setExtendedState(JFrame.NORMAL);
                      }
                  });
                  popup.add(defaultItem);
                  trayIcon=new TrayIcon(image, "SystemTray Demo", popup);
                  trayIcon.setImageAutoSize(true);
              }else{
                  System.out.println("system tray not supported");
              }
              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("Duke256.png"));
      
              setVisible(true);
              setSize(300, 200);
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          }
          public static void main(String[] args){
              new HideToSystemTray();
          }
      }
      

      这是工作程序!

      【讨论】:

        【解决方案3】:

        myFrame#getExtendedStatemyFrame#setExtendedState

        基本上最好多玩这些扩展状态

        frame.setExtendedState(JFrame.ICONIFIED);
        frame.setExtendedState(frame.getExtendedState() | JFrame.ICONIFIED);
        
        
        frame.setExtendedState(JFrame.NORMAL);
        frame.setExtendedState(frame.getExtendedState() & (~JFrame.ICONIFIED));
        

        编辑 1.

        例如

        import java.awt.event.ActionEvent;
        import javax.swing.*;  
        public class WindowGCDemo1 {  
            private javax.swing.Timer timer = null;
            private int count = 0;
            private JFrame myFrame = new JFrame();  
            public WindowGCDemo1() {
                myFrame = new JFrame();
                myFrame.setLocation(150, 150);
                myFrame.setSize(200, 400);
                myFrame.setVisible(true);
                System.out.println(myFrame.getExtendedState());
                start();
            }  
            private void start() {
                timer = new javax.swing.Timer(1000, updateCol());
                timer.start();
            }  
            public Action updateCol() {
                return new AbstractAction("Set Delay") {  
                    private static final long serialVersionUID = 1L;  
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        timer.stop();
                        myFrame.setExtendedState(JFrame.ICONIFIED);
                        System.out.println(myFrame.getExtendedState());
                        count++;
                        startAgain();
                    }
                };
            }  
            private void startAgain() {
                timer = new javax.swing.Timer(1000, updateColAgain());
                timer.start();
            }  
            public Action updateColAgain() {
                return new AbstractAction("Set Delay") {  
                    private static final long serialVersionUID = 1L;  
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        timer.stop();
                        myFrame.setExtendedState(JFrame.NORMAL);
                        System.out.println(myFrame.getExtendedState());
                        count++;
                        if (count > 5) {
                            timer.stop();
                            stop();
                        }
                        start();
                    }
                };
            }  
            private void stop() {
                System.out.println("--------------------------------------------");
                System.out.println("System Exit");
                System.exit(0);
            } 
            public static void main(String[] args) {
                SwingUtilities.invokeLater(new Runnable() {  
                    @Override
                    public void run() {
                        WindowGCDemo1 windowGCDemo = new WindowGCDemo1();
                    }
                });
            }
        }
        

        编辑 2.

        对于SystemTry,您必须为您的JFrame#setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 设置正确的JMenuItem(s) from JPopupMenu,只需JFrame#setVisible(true);

        【讨论】:

        • 我没有正确理解。请告诉我要遵循的步骤!
        • 上述方法似乎是针对settinggetting框架的扩展状态,但是将frame最小化为系统托盘图标的逻辑呢?
        • 嗯,我无法阅读整个问题,请参阅我的 EDIT 1 了解我的误解
        • 将添加回答您的问题,我的错
        • 最好链接到最新版本的JavaDocs。我已将您的答案编辑为指向 J2SE 7。有关获取最新文档链接的提示,请参阅 point 2 of advantages
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多