JFrame最大最小化及最小化到系统托盘

转载自:http://hi.baidu.com/lovezmq/blog/item/e14c593dd04d0cf93c6d97cd.html

基本的最大化最小化只要调用setExtendedState方法就可以了。

setExtendedState方法的输入参数是在Frame类中定义的常量:

NORMAL:常态
ICONIFIED:最小化
MAXIMIZED_HORIZ:水平最大化
MAXIMIZED_VERT:垂直最大化
MAXIMIZED_BOTH:水平垂直都最大化


因此,如果需要全屏话,可以这样:
setExtendedState(Frame.MAXIMIZED_BOTH);


如果需要最小化,则可以这样:
setExtendedState(Frame.ICONIFIED);


 使用SystemTray和TrayIcon实现系统托盘

以前在做系统托盘功能时,基本都是使用开源的trayicon实现的,因为J2SE中没有提供这样的功能。但是从J2SE6开始,已经支持了。在java.awt中增加了俩个类,一个是SystemTray,另一个是TrayIcon。
每个java应用程序中,都会 有一个缺省的SystemTray实例,可以通过SystemTray.getSystemTray() 方法得到SystemTray实例。而TrayIcon才是真正的系统托盘内容,也就是说,TrayIcon是通过SystemTray才添加到系统托盘 中的。系统托盘中的其他内容,比如菜单、图片、提示能都是通过TrayIcon封装的。
添加一个系统托盘,可以这样调用:
SystemTray tray = SystemTray.getSystemTray();
tray.add(trayIcon);
而删除一个系统托盘,就可以这样:
SystemTray.getSystemTray().remove(trayIcon);
 
下面给出一个基于JFrame对应用界面程序实现最小化时隐藏到系统托盘的功能:
import java.awt.BorderLayout;


import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class SysTrayFrame extends JFrame {
   private TrayIcon trayIcon;
   BorderLayout borderLayout1 = new BorderLayout();
   JPanel root = new JPanel();
   JButton exit = new JButton();

    public SysTrayFrame() {
       try {
           jbInit();
           pack();
           this.initTrayIcon();
       } catch (Exception exception) {
           exception.printStackTrace();
       }
   }

    private void jbInit() throws Exception {
       this.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
       this.addWindowListener(new WindowAdapter(){
           //捕获窗口关闭事件
           public void windowClosing(WindowEvent e){           
               if(SystemTray.isSupported()){
                   setVisible(false);
                   minimizeToTray();
               }
               else{
                   System.exit(0);
               }
           }
           //捕获窗口最小化事件
           public void windowIconified(WindowEvent e){
               if(SystemTray.isSupported()){
                   setVisible(false);
                   minimizeToTray();
               }
               else{
                   System.exit(0);
               }
           }
       });
       getContentPane().setLayout(borderLayout1);
       exit.setText("exit");
       exit.addActionListener(new SysTrayFrame_exit_actionAdapter(this));
       this.getContentPane().add(root, java.awt.BorderLayout.CENTER);
       root.add(exit);
   }
  
   private void initTrayIcon(){
       Image image = Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("Duke16.gif"));
       PopupMenu popup = new PopupMenu();
       MenuItem exitItem = new MenuItem("Show");
       ActionListener listener = new ActionListener(){
           public void actionPerformed(ActionEvent e) {
               setVisible(true);
               setExtendedState(Frame.NORMAL);
               SystemTray.getSystemTray().remove(trayIcon);
            }
       };
       exitItem.addActionListener(listener);
       popup.add(exitItem);
       //根据image、提示、菜单创建TrayIcon
       this.trayIcon = new TrayIcon(image,"MyTray",popup);
       //给TrayIcon添加事件监听器
       this.trayIcon.addActionListener(listener);       
   }

    public void minimizeToTray(){
       SystemTray tray = SystemTray.getSystemTray();
        try {
           tray.add(this.trayIcon);
       } catch (AWTException ex) {
           ex.printStackTrace();
       }
   }

    public static void main(String[] args) {
       SysTrayFrame systrayframe = new SysTrayFrame();
       systrayframe.setTitle("MyTray");
       systrayframe.setVisible(true);
   }

    public void exit_actionPerformed(ActionEvent e) {
       System.exit(0);
   }
}

class SysTrayFrame_exit_actionAdapter implements ActionListener {
   private SysTrayFrame adaptee;
   SysTrayFrame_exit_actionAdapter(SysTrayFrame adaptee) {
       this.adaptee = adaptee;
   }

    public void actionPerformed(ActionEvent e) {
       adaptee.exit_actionPerformed(e);
   }
}
上面的示例中,关闭窗口和最小化窗口都隐藏应用到系统托盘,只有点击exit按钮才真正退出。当然,比较好的做饭时,在点击最小化时隐藏到系统托盘,点击关闭时提示用户,是要隐藏到系统托盘还是真的要退出,这样就更人性化。

其中的关键代码已经标注为蓝色,其他的都是些辅助。

如果要实现更高级点的功能,比如根据程序运行状态改变系统托盘图标、提示等,就需要通过给SystemTray添加属性变化监听器来实现,即addPropertyChangeListener接口。通过在addPropertyChangeListener接口中propertyChange方法中监听指定的属性值,再更具需要修改TrayIcon的内容即可实现动态监听和变化的功能。

http://blog.sina.com.cn/s/blog_46e73e77010089w1.html

posted on 2012-04-03 17:53  yang3wei  阅读(920)  评论(0编辑  收藏  举报