• Swing 窗口的最小化到系统图标与还原


    2014年2月26日 13:01:47

    一个上午的功夫,终于折腾好了。

    上午主要是卡在监听事件的参数问题。当时脑子不好使,忘记事件是自己构造的,傻傻的测试了半天,如何传递窗口的参数

    等中午解决的时候,又卡在系统托盘图标无法移除。 最后找到原因,最小化的代码摘抄之网络上,但是该代码的 执行逻辑有问题,再调整以后,总算变好。源代码中的移除时 对象为null,导致问题。调整对象创建的顺序即可解决。

    设置窗体的图标时,网络上推荐:本人测试无法使用。一直为空

    URL url = this.getClass().getResource("/images/01.jpg");
    Image img = Toolkit.getDefaultToolkit().getImage(url);
    this.setIconImage(img);
    

     实际中:可以使用

    Image img = Toolkit.getDefaultToolkit().getImage("c:/1.jpg");
    this.setIconImage(img);
    

    ##########################3

    2014年2月26日 14:47:54 图形界面做好了,测试OK。

    讲几点文章开头的问题和收获

    实现系统托盘的功能代码

            // TODO Auto-generated method stub
            // 窗口最小化时执行
            this.setVisible(false);
            TrayIcon trayIcon = null;
            SystemTray tray = null;
            if (SystemTray.isSupported()) // 判断系统是否支持系统托盘
            {
                tray = SystemTray.getSystemTray(); // 创建系统托盘
                Image image = Toolkit.getDefaultToolkit().getImage("./config/1.jpg");// 载入图片,这里要写你的图标路径哦
    
                // 创建弹出菜单
                PopupMenu popup = new PopupMenu();
                // 主界面选项
                MenuItem mainFrameItem = new MenuItem("主界面");
                // 退出程序选项
                MenuItem exitItem = new MenuItem("退出程序");
    
                trayIcon = new TrayIcon(image, "SdS", popup);// 创建trayIcon
                trayIcon.setImageAutoSize(true);//自动设置图片大小
    
                // 主界面执行的事件,回复窗口
                ActionListener listener = new ShowJF(this, tray, trayIcon);
    
                mainFrameItem.addActionListener(listener);
    
                exitItem.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        if (JOptionPane.showConfirmDialog(null, "确定退出系统") == 0) {
                            
                            Runtime run = Runtime.getRuntime();
    
                            try {
                                run.exec("taskkill /im SdsServer.exe /f /t");
                            } catch (IOException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            }
    
                            System.exit(0);
                        }
                    }
                });
    
                popup.add(mainFrameItem);
                popup.add(exitItem);
    
                trayIcon.addActionListener(listener);
                try {
                    tray.add(trayIcon);
                } catch (AWTException e1) {
                    e1.printStackTrace();
                }
            }
    
        }
    系统托盘

    双击托盘的事件

    package cn.wuwenfu.swing;
    
    import java.awt.Frame;
    import java.awt.SystemTray;
    import java.awt.TrayIcon;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JFrame;
    
    public class ShowJF  implements ActionListener{
        private JFrame jf;
        private SystemTray st;
        private TrayIcon ti;
        
        
        public ShowJF(JFrame jf,SystemTray st,TrayIcon ti){
            this.jf=jf;
            this.st=st;
            this.ti=ti;
            
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            
            
    
            jf.setVisible(true);
            st.remove(ti);
            jf.setExtendedState(Frame.NORMAL); //恢复窗口时自动弹出,否则只能在任务栏显示
            
            
            
        }
    
    }
    双击托盘的事件

    在事件中有一个remove方法,我之前的遇到的问题是:调用这个remove方法时,传递的对象TrayIcon是空。所以屡屡报错。

    另外一个就是问题: setVisible方法,只能保证程序显示在任务栏,没有弹出主界面。 所以必须添加一个setExtendedState方法

    第三个问题:窗体图标的问题,网络的方法报错,省去URL反而可行。 原因未明。

    问题的解决,也就是我今天的收获。

    QQ:540045865 热爱生活,热爱编程。
  • 相关阅读:
    TWinControl、TCustomControl和TGraphicControl对WM_PAINT消息的三种不同处理(虚函数的特点就是升升降降)
    VCL里的构造函数
    从良难
    TTimer源码研究
    Delphi的RTTI(许多参考链接)
    对ShortCut和TWMKey的研究
    TTimer很特殊
    TEdit的创建与显示过程
    VMware vSphere 服务器虚拟化之二十六 桌面虚拟化之View Persona Management
    Delphi Math里的基本函数,以及浮点数比较函数
  • 原文地址:https://www.cnblogs.com/jsRunner/p/3568964.html
Copyright © 2020-2023  润新知