如何隐藏任务栏系统托盘中的JFrame
我创build了一个JFrame
并希望隐藏在taskbar
(在windows
不可见的权利在底部,但隐藏在tray menu items
)。
有谁可以告诉我该怎么做?
我是否需要在windows
系统设置中进行一些更改?
例如,您可能已经看到一些download managers
, team viewer
, 4shared desktop
等隐藏在任务栏的托盘菜单项。
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(); } }
这是工作程序!
myFrame#getExtendedState和myFrame#setExtendedState
基本上是更好地多重播放这些ExtendedStates
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);
并从JPopupMenu正确的JMenuItem(s) ,只是JFrame#setVisible(true);
检查文档中的TryIconDemo。 这个链接包含一小段代码。 复制并在您的IDE上运行它。
/* * 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(); } } }