I found two ways to do what you need.
One of them is settar your kind of JFrame
for JFrame.Type.UTILITY
.
Obs: You can only change the kind of JFrame
while he is not yet visible.
Obs2: I tested with the JDK 1.7, I don’t know if there’s a method .setType()
for lower versions.
What I did was
JFrame frame = new JFrame();
frame.setSize(100, 100);
frame.setLocation(100, 150);
frame.setType(JFrame.Type.UTILITY); //Essa é a parte importante
frame.setVisible(true); //Note que eu só deixei o frame visível após usar o setType()
To apply this to your case, you will need to use the event setType()
whenever you minimize or maximize the window, to take it out and put it on TaskBar
Windows, respectively. For this you can use the method windowStateChanged()
, likely that you are already using it to place the icon on Tray Icon.
Method documentation setType()
Documentation of Enum Window.Type
The other solution I found in Soen, it is very easy to understand what the code does. Besides having what you need, it still has a menu popup
on the icon that stands Tray. Follow below the original code.
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();
}
}
só que ao minimizar a aplicação não consigo somente mantê-la no minimizada no tray
What do you mean by that? That the icon is still on the taskbar?– Jéf Bueno
@Yes, that’s the question.
– DevAgil
Are you using
swing
orawt
?– Jéf Bueno
@Jéfersonbueno I’m using swing
– DevAgil