2011-09-18 14 views
33

Utworzono JFrame i chcę ukryć się w taskbar (w windows niewidoczna na samym dole, ale ukryta w tray menu items).
Czy ktoś może mi powiedzieć, jak to zrobić?
Czy muszę wprowadzić pewne zmiany w ustawieniach systemu windows?
na przykład, mogłeś zobaczyć, że niektóre pozycje download managers, team viewer, 4shared desktop itp. Są ukryte w elementach paska zadań paska zadań.Jak ukryć ramkę JFrame w zasobniku systemowym paska zadań

Odpowiedz

44
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(); 
    } 
} 

Jest to program pracy!

4

myFrame#getExtendedState i myFrame#setExtendedState

zasadzie lepiej Multiplay te ExtendedStates

frame.setExtendedState(JFrame.ICONIFIED); 
frame.setExtendedState(frame.getExtendedState() | JFrame.ICONIFIED); 


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

EDIT 1.

np

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(); 
      } 
     }); 
    } 
} 

EDIT 2.

dla SystemTry trzeba ustawić dla JFrame#setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); i we właściwej JMenuItem(s) from JPopupMenu tylko JFrame#setVisible(true);

+0

nie dostać go prawidłowo. Proszę, powiedz mi, jakie kroki należy wykonać! –

+0

Powyższa metoda wydaje się być dla 'ustawienia' i' pobierania 'stanu rozszerzonego ramki, ale co z logiką, która ma zostać zaimplementowana w celu zminimalizowania' ramki' do ikony w zasobniku systemowym? –

+0

hmmm Nie mogę przeczytać całego pytania zobacz moją EDYT 1 dla mojego missunderstood – mKorbel

-3

Sprawdź trylconDemo z dokumentacji. Ten link zawiera mały fragment kodu. Skopiuj i uruchom go na swoim 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(); 
     } 
    } 
} 
Powiązane problemy