思路:在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();、
if (security != null) {
security.checkExit(0);
}
}
if (this.defaultCloseOperation != operation) {
int oldValue = this.defaultCloseOperation;
this.defaultCloseOperation = operation;
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;
}
if (changeSupport == null ||
(oldValue != null && newValue != null && oldValue.equals(newValue))) {
return;
}
changeSupport.firePropertyChange(propertyName, oldValue, newValue);
}
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) {
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框架来实现多窗口切换,这在开发复杂的桌面应用程序时非常常见。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,使得构建美观且功能强大的应用变...
本示例将聚焦于如何在Microsoft Visual Studio(VS)环境中利用Qt进行多窗口显示的实现。 首先,要在Visual Studio中使用Qt,你需要安装Qt for Visual Studio插件,这允许你在VS的IDE中直接创建、编辑和调试Qt项目...
在本项目中,我们主要探讨如何使用Qt框架与OpenGL库结合来实现多窗口中的三维图形变换。Qt是一个跨平台的应用程序开发框架,广泛用于GUI应用,而OpenGL则是一种用于渲染2D、3D矢量图形的低级编程接口。通过这两者的...
总结来说,实现“C# 实现多窗口间线程控制”涉及的知识点包括线程的创建和管理、UI线程安全、窗口通信、事件驱动编程、异步编程等。在实际项目中,需要结合具体需求灵活运用这些技术,确保程序的稳定性和用户体验。
在VC++编程环境中,实现多窗口多视图的应用程序是一项常见的任务,这主要涉及到MFC(Microsoft Foundation Classes)框架的应用。MFC是微软为Windows平台提供的C++类库,它封装了Windows API,使得开发者可以更高效...
js 实现 关闭窗口时的提示! 值得下载看看!资源免费,大家分享!!
js 实现 关闭窗口不提示的方法! 值得下载看看!资源免费,大家分享!!
本文将深入探讨“电信设备-实现多窗口操作的移动终端及方法”这一主题,旨在提供一个全面的理解框架,帮助读者掌握如何在移动设备上实现高效多任务处理。 首先,我们需要了解多窗口操作的基本概念。多窗口操作允许...
js 实现 关闭窗口的链接! 值得下载看看!资源免费,大家分享!!
Qt 国际化动态语言切换多窗口翻译 在 Qt 中实现国际化是一件非常重要的事情,特别是在多语言支持方面。Qt 提供了强大的国际化机制...动态语言切换和多窗口翻译可以通过使用 QTranslator 类和 changeEvent 函数来实现。
本文将详细讲解如何使用MFC创建一个能够实现多窗口同时显示的应用程序,以及在这个过程中可能遇到的关键知识点。 首先,我们需要了解MFC的基本结构。MFC将Windows API封装成C++类,比如CWinApp代表应用程序类,CWnd...
这种技术允许开发者将多个窗口或者控件进行组合,形成一个复合窗口,可以实现更丰富的交互效果。 “窗口_透明_去色”是易语言中的一个功能,它涉及到窗口的透明度控制。在GUI编程中,透明度控制是一项重要的技术,...
【标题】: "用C#实现的一个多窗口浏览器" 是一个基于C#编程语言开发的浏览器应用程序,它具有与Internet Explorer 7不同的多选项卡浏览功能。这个项目旨在提供一个可自定义的、多任务处理的浏览体验,允许用户同时在...
在PyQT中实现多窗口切换是一项常见的任务,特别是在构建GUI应用程序时。PyQT是一个Python绑定的Qt库,它提供了丰富的功能来创建用户界面。在本文中,我们将深入探讨如何使用PyQT来实现在不同窗口之间的切换。 首先...
这个“C#实现的多窗口互相通信”项目旨在提供一个跨平台的解决方案,目前已经支持C++ Builder、Delphi和C#,并且计划扩展到VC++。下面我们将详细探讨C#中实现多窗口通信的关键技术点。 1. **Windows Forms中的控件...
c#webbrowser实现多个窗口独立不同的cookie
### C#中利用委托实现子窗口关闭时通知父窗口执行特定方法 在C#中,事件和委托是非常重要的概念,特别是在处理用户界面交互时。本文将详细介绍如何利用委托(Delegate)来实现在关闭子窗口时通知父窗口执行特定的...
C# WPF 通过委托实现多窗口间的传值方法 在C# WPF开发中,需要在多个窗口之间传递值是一个常见的问题。其中一种解决方法是使用委托来实现多窗口间的传值。下面我们将详细介绍如何使用委托来实现多窗口间的传值。 ...
本文将深入探讨如何在Microsoft Foundation Class (MFC) 应用程序框架下,利用Ogre引擎实现多窗口展示同一个场景(Scence)的详细过程。 Ogre是一个功能强大的3D渲染引擎,它提供了丰富的图形处理能力,包括硬件...
综合以上信息,我们可以深入探讨如何在VB.NET中实现关闭窗口的特效。首先,我们需要在FormClosing事件中编写代码,根据不同的特效需求,可能需要设置一个计时器控制关闭速度,并在每次间隔中改变窗体的透明度、大小...