如何在任务栏的系统托盘中隐藏 JFrame
我已经创建了一个,并希望将其隐藏在中,但是,它不应该在右下角可见,而是隐藏在.JFrame
taskbar
windows
tray menu items
谁能告诉我怎么做?
我是否需要对 的系统设置进行一些更改?windows
例如,您可能已经看到一些 、 、 等隐藏在任务栏的托盘菜单项中。download managers
Team Viewer
4shared desktop
我已经创建了一个,并希望将其隐藏在中,但是,它不应该在右下角可见,而是隐藏在.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 and myFrame#setExtendedState
基本上最好是多重播放这些扩展状态
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,您必须从 JPopupMenu 中为您的和正确的 JMenuItem(s) 进行设置,只需JFrame#setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
JFrame#setVisible(true);