How to hide a JFrame in system tray of taskbar
I have created a JFrame
and want to hide it in the taskbar
in windows
, but, it should not be visible in the bottom right corner, but hidden in the tray menu items
.
Can anybody tell me how to do this?
Do I need to make some changes in system settings of windows
?
For example, you might have seen some download managers
, Team Viewer
, 4shared desktop
, etc. are hidden in taskbar's tray menu items.
Solution 1:
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();
}
}
This is the working program!
Solution 2:
myFrame#getExtendedState and myFrame#setExtendedState
basically is better to multiplay these ExtendedStates
frame.setExtendedState(JFrame.ICONIFIED);
frame.setExtendedState(frame.getExtendedState() | JFrame.ICONIFIED);
frame.setExtendedState(JFrame.NORMAL);
frame.setExtendedState(frame.getExtendedState() & (~JFrame.ICONIFIED));
EDIT 1.
for example
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.
for SystemTry you have to set for your JFrame#setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
and in the proper JMenuItem(s) from JPopupMenu, just JFrame#setVisible(true);