`
noble510520
  • 浏览: 56916 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

怎么实现关闭窗口

 
阅读更多

思路:在java源文件中查找源代码
首先,我们知道JFrame.setDefaultCloseOperation(int operation)中提供了四种方式去实现关闭窗口
JFrame在包javax.Swing中,所以他继承了java.awt.Frame

setDefaultCloseOperation(int operation)

下面贴上 JFrame.setDefaultCloseOperation(int operation) 的代码

    public void setDefaultCloseOperation(int operation) {
    //判断参数是否正确,错误则抛出非法参数异常
        if (operation != DO_NOTHING_ON_CLOSE &&
            operation != HIDE_ON_CLOSE &&
            operation != DISPOSE_ON_CLOSE &&
            operation != EXIT_ON_CLOSE) {
            throw new IllegalArgumentException("defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, DISPOSE_ON_CLOSE, or EXIT_ON_CLOSE");
        }

        if (operation == EXIT_ON_CLOSE) {
            SecurityManager security = System.getSecurityManager();、
            //lang.SecurityManager是一个安全管理器,可以预判操作是否正确,以决定是否要执行这个操作
            //判断当前应用程序是否建立了安全管理器,如果没建立,则返回Null,此时不可以强退
            if (security != null) {
                security.checkExit(0);
            }
        }
        //判断改变前后属性是否改变,不改变则不用执行操作
        if (this.defaultCloseOperation != operation) {
            int oldValue = this.defaultCloseOperation;
            this.defaultCloseOperation = operation;
            //JFrame完全继承了父类Frame的firePropertyChang的方法
            firePropertyChange("defaultCloseOperation", oldValue, operation);
        }
    }

类SecurityManager是在java.lang包中的
可以通过静态方法System.getSecurityManager()获得当前程序的安全管理器(如果没有建立安全管理器,则返回null)
checkExit(int status):int
如果不允许调用线程使用特定的状态码暂停 Java 虚拟机,则抛出 SecurityException。
所以可以来判断此时退出是否安全

四种参数表示的意思:
DO_NOTHING_ON_CLOSE(在 WindowConstants中定义):不执行任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing 方法中处理该操作。
HIDE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册的 WindowListener 对象后自动隐藏该窗体。
DISPOSE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册 WindowListener 的对象后自动隐藏并释放该窗体。
EXIT_ON_CLOSE(在 JFrame 中定义):使用 System exit 方法退出应用程序。仅在应用程序中使用。

WindowConstans(窗口常量)是在包Javax.Swing中的接口
然而窗口即使不注册指定的监视器也可以最大化最小化,所以推测,当初始化窗口的时候,窗口会默认注册监视器

从上面看出,下面要去找firePropertyChange()方法

firePropertyChange()

从方法名可以看出,这个方法是用于改变配置的
又这个方法在Component中,所以一定还有其他的修改配置方法会通过firePropertyChange()方法去修改
如果改变颜色啊 字体啊 大小啊 什么什么的

firePropertyChange()在java.awt.Component中

下面贴出在java.awt.Component中的firePropertyChange()

    protected void firePropertyChange(String propertyName,
                                      Object oldValue, Object newValue) {
        PropertyChangeSupport changeSupport;
        synchronized (getObjectLock()) {
            changeSupport = this.changeSupport;
        }
        //在类中找到了changeSupport 的定义 但是没有找到他的初始化 这是怎么回事?
        if (changeSupport == null ||
            (oldValue != null && newValue != null && oldValue.equals(newValue))) {
            return;
        }
        changeSupport.firePropertyChange(propertyName, oldValue, newValue);
    }
    //重载形式,参数为int
    protected void firePropertyChange(String propertyName,
                                      int oldValue, int newValue) {
        PropertyChangeSupport changeSupport = this.changeSupport;
        if (changeSupport == null || oldValue == newValue) {
            return;
        }
        changeSupport.firePropertyChange(propertyName, oldValue, newValue);
    }

从上面看 我们还需要去PropertyChangeSupport中去找

PropertyChangeSupport中的firePropertyChange()

贴代码

    public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
        if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
            firePropertyChange(new PropertyChangeEvent(this.source, propertyName, oldValue, newValue));
        }
    }
  //重载形式,参数为整型
   public void firePropertyChange(String propertyName, int oldValue, int newValue) {
        if (oldValue != newValue) {
        //将int参数包装成Integer对象,再调用参数为Object的方法
            firePropertyChange(propertyName, Integer.valueOf(oldValue), Integer.valueOf(newValue));
        }
    }
   public void firePropertyChange(PropertyChangeEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();
        if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
            String name = event.getPropertyName();

            PropertyChangeListener[] common = this.map.get(null);
            PropertyChangeListener[] named = (name != null)
                        ? this.map.get(name)
                        : null;

            fire(common, event);
            fire(named, event);
        }
    }
    //实际在监听器中改变事件
    private static void fire(PropertyChangeListener[] listeners, PropertyChangeEvent event) {
        if (listeners != null) {
            for (PropertyChangeListener listener : listeners) {
                listener.propertyChange(event);
            }
        }
    }

然后一查 PropertyChangeListener 是一个接口,有好多好多的实现类 , 然后我就不知道怎么查了

其实从那四个参数的意思上面看也能看出个大概

答案

DO_NOTHING_ON_CLOSE:什么都不做,那我就根本不用实现关闭按钮了
HIDE_ON_CLOSE:隐藏窗口,那我把窗口设为invisible就可以啦
DISPOSE_ON_CLOSE:退出时释放窗口,那就把窗口对象清理掉就行拉
EXIT_ON_CLOSE:这个肯定是直接退出程序啦

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    Qt5实现多窗口切换

    在本文中,我们将深入探讨如何使用Qt5框架来实现多窗口切换,这在开发复杂的桌面应用程序时非常常见。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,使得构建美观且功能强大的应用变...

    Qt在VS中实现多窗口显示

    本示例将聚焦于如何在Microsoft Visual Studio(VS)环境中利用Qt进行多窗口显示的实现。 首先,要在Visual Studio中使用Qt,你需要安装Qt for Visual Studio插件,这允许你在VS的IDE中直接创建、编辑和调试Qt项目...

    qt+opengl 实现多窗口三维图形变换

    在本项目中,我们主要探讨如何使用Qt框架与OpenGL库结合来实现多窗口中的三维图形变换。Qt是一个跨平台的应用程序开发框架,广泛用于GUI应用,而OpenGL则是一种用于渲染2D、3D矢量图形的低级编程接口。通过这两者的...

    c# 实现多窗口间线程控制

    总结来说,实现“C# 实现多窗口间线程控制”涉及的知识点包括线程的创建和管理、UI线程安全、窗口通信、事件驱动编程、异步编程等。在实际项目中,需要结合具体需求灵活运用这些技术,确保程序的稳定性和用户体验。

    VC++ 实现多窗口多视图例子

    在VC++编程环境中,实现多窗口多视图的应用程序是一项常见的任务,这主要涉及到MFC(Microsoft Foundation Classes)框架的应用。MFC是微软为Windows平台提供的C++类库,它封装了Windows API,使得开发者可以更高效...

    js 实现 关闭窗口时的提示

    js 实现 关闭窗口时的提示! 值得下载看看!资源免费,大家分享!!

    js 实现 关闭窗口不提示的方法

    js 实现 关闭窗口不提示的方法! 值得下载看看!资源免费,大家分享!!

    电信设备-实现多窗口操作的移动终端及方法.zip

    本文将深入探讨“电信设备-实现多窗口操作的移动终端及方法”这一主题,旨在提供一个全面的理解框架,帮助读者掌握如何在移动设备上实现高效多任务处理。 首先,我们需要了解多窗口操作的基本概念。多窗口操作允许...

    js 实现 关闭窗口的链接

    js 实现 关闭窗口的链接! 值得下载看看!资源免费,大家分享!!

    Qt国际化 动态语言切换 多窗口翻译

    Qt 国际化动态语言切换多窗口翻译 在 Qt 中实现国际化是一件非常重要的事情,特别是在多语言支持方面。Qt 提供了强大的国际化机制...动态语言切换和多窗口翻译可以通过使用 QTranslator 类和 changeEvent 函数来实现。

    mfc 创建多窗口同时显示

    本文将详细讲解如何使用MFC创建一个能够实现多窗口同时显示的应用程序,以及在这个过程中可能遇到的关键知识点。 首先,我们需要了解MFC的基本结构。MFC将Windows API封装成C++类,比如CWinApp代表应用程序类,CWnd...

    易语言多层合成窗口

    这种技术允许开发者将多个窗口或者控件进行组合,形成一个复合窗口,可以实现更丰富的交互效果。 “窗口_透明_去色”是易语言中的一个功能,它涉及到窗口的透明度控制。在GUI编程中,透明度控制是一项重要的技术,...

    用C#实现的一个多窗口浏览器

    【标题】: "用C#实现的一个多窗口浏览器" 是一个基于C#编程语言开发的浏览器应用程序,它具有与Internet Explorer 7不同的多选项卡浏览功能。这个项目旨在提供一个可自定义的、多任务处理的浏览体验,允许用户同时在...

    PyQT实现多窗口切换

    在PyQT中实现多窗口切换是一项常见的任务,特别是在构建GUI应用程序时。PyQT是一个Python绑定的Qt库,它提供了丰富的功能来创建用户界面。在本文中,我们将深入探讨如何使用PyQT来实现在不同窗口之间的切换。 首先...

    C#实现的多窗口互相通信

    这个“C#实现的多窗口互相通信”项目旨在提供一个跨平台的解决方案,目前已经支持C++ Builder、Delphi和C#,并且计划扩展到VC++。下面我们将详细探讨C#中实现多窗口通信的关键技术点。 1. **Windows Forms中的控件...

    c#webbrowser实现多个窗口独立不同的cookie

    c#webbrowser实现多个窗口独立不同的cookie

    c#利用委托来实现关闭子窗口通知父窗口执行方法

    ### C#中利用委托实现子窗口关闭时通知父窗口执行特定方法 在C#中,事件和委托是非常重要的概念,特别是在处理用户界面交互时。本文将详细介绍如何利用委托(Delegate)来实现在关闭子窗口时通知父窗口执行特定的...

    C# WPF 通过委托实现多窗口间的传值的方法

    C# WPF 通过委托实现多窗口间的传值方法 在C# WPF开发中,需要在多个窗口之间传递值是一个常见的问题。其中一种解决方法是使用委托来实现多窗口间的传值。下面我们将详细介绍如何使用委托来实现多窗口间的传值。 ...

    Ogre在MFC下的多窗口实现

    本文将深入探讨如何在Microsoft Foundation Class (MFC) 应用程序框架下,利用Ogre引擎实现多窗口展示同一个场景(Scence)的详细过程。 Ogre是一个功能强大的3D渲染引擎,它提供了丰富的图形处理能力,包括硬件...

    向你展示16种关闭窗口的特效

    综合以上信息,我们可以深入探讨如何在VB.NET中实现关闭窗口的特效。首先,我们需要在FormClosing事件中编写代码,根据不同的特效需求,可能需要设置一个计时器控制关闭速度,并在每次间隔中改变窗体的透明度、大小...

Global site tag (gtag.js) - Google Analytics