web-dev-qa-db-ja.com

タスクバーのシステムトレイでJFrameを非表示にする方法

JFrameを作成し、taskbarで非表示にしたい(windowsで右下に見えず、tray menu items)。
誰もそれを行う方法を教えてもらえますか?
windowsのシステム設定を変更する必要がありましたか?
たとえば、いくつかのdownload managersteam viewer4shared desktopなどは、タスクバーのトレイメニュー項目で非表示になります。

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

これが作業プログラムです!

48
Mohammad Faisal

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。

SystemTryJFrame#setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);に設定し、適切な JPopupMenuのJMenuItem(s) 、ちょうどJFrame#setVisible(true);に設定する必要があります

4
mKorbel