SWT中的Dispose操作法则

2024-06-16 04:38
文章标签 操作 法则 swt dispose

本文主要是介绍SWT中的Dispose操作法则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

法则一:如果你创建了他,那么就要释放他
在本章节的前一部分,你知道了创建SWT控件,相应的本地控件也被创建了。也就是说,调用了SWT的构造函数,底层的本地资源也被创建了。所以如果你写下如下代码,那么你就创建了一个SWT颜色对象,那么也就在系统的底层资源里分配了一个颜色资源:
Color color = new Color(display, 255, 0, 0); // Create a red Color
法则一说明了如果你创建了他,那么你就要在使用完时释放他,像下面一样:
color.dispose(); // I create it, so I dispose it
但是,如果你没有使用构造函数来申请资源,你就不能显式的释放他。比如,考虑下面的代码:
Color color = display.getSystemColor(SWT.COLOR_RED); // Create a red Color
再一次,获得了底层平台的颜色资源,但是没有分配他。法则一就说不能释放他。为什么不呢?因为这个不属于你-你只是借用了这个资源,其他的对象有可能正在使用它或者将要使用它。释放这个资源会变得非常严重的。


法则二:释放了父控件,子控件也被释放
对每一个使用new创建的控件都使用dispose()会变得非常繁琐,会使得SWT很快被抛弃。但是,SWT的设计者意识到了这一点,创建了一种逻辑上层叠的自动释放机制。这意味着,当一个Shell被释放了,所有与Shell有关的控件都被自动释放了。你会发现,永远也不会使用label.dispose()在“Hello World”程序里,甚至你使用了new来创建一个Label对象。当用户关闭了Shell,Label控件自动的释放了。
也许你在想,你永远不需要调用dispose(),这部分代码只是在浪费空间。实际上,有可能写一些程序,所有的资源都只有一个父类,并且这些资源都会自动释放。但是,考虑一下下面的改变Text中字体的代码。如下:
Text text = new Text(shell, SWT.BORDER); //Create the text field
Font font = new Font(display, ”Arial”, 4, SWT.BOLD); //Create the new font
text.setFont(font); //Set the font into the text field
这个字体对象创建时没有父类,所以不会被自动释放,甚至当Shell被关闭了,Text对象调用了dispose()。也许你会对使用font这个负担而发怒,但是考虑到text没有理由要对font负责-font不属于他。实际上,你也许会使用这个Font对象在各种各样的控件上,自动释放会引发一系列的问题。

另外:
如果Java包裹的本地控件依然在活动,而他所属于的Shell被释放了,将发生什么情况呢?或者手动调用控件的dispose方法会怎么样呢?本地控件会被释放吗?我们是否可以调用java对象而他的底层本地控件不存在?
答案当然是:可以!如果你调用一个对象而他的本地控件已经释放,会引出一些麻烦。一旦一个控件被释放了,甚至他依然在活动,对他做什么都没有用。是的,Java对象依然可用,但是底层的对应点已经释放了。那么就会得到一个SWTException,显示为“Widget has been disposed”。考虑Listing 3-2的代码。
Listing 3-2:Broken.java

CODE:

import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class Broken
{
public static void main(String[] args)
{
  Display display = new Display();
  Shell shell = new Shell(display);
  shell.setLayout(new RowLayout());
  Text text = new Text(shell, SWT.BORDER);
  shell.open();
  while (!shell.isDisposed())
  {
  if (!display.readAndDispatch())
  {
    display.sleep();
  }
  }
  System.out.println(text.getText()); // PROBLEM!
  display.dispose();
  }
}


代码可以编译和运行,但是在关闭了主窗口后控制台会打印出以下的错误:
Org.eclipse.swt.SWTException: Widget is disposed
at org.eclipse.swt.SWT.error(SWT.java:2332)
at org.eclipse.swt.SWT.error(SWT.java:2262)
at org.eclipse.swt.widgets.Widget.error(Widget.java:385)
at org.eclipse.swt.widgets.Control.getDisplay(Control.java:735)
at org.eclipse.swt.widgets.Widget.isValidThread(Widget.java:593)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:315)
at org.eclipse.swt.widgets.Text.getText(Text.java:705)
at Broken.main(Verison.java:24)

 

这篇关于SWT中的Dispose操作法则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065475

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

《JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)》本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有... 目录第一步 下载安装JDK第二步 配置环境变量第三步 切换JDK版本并验证可能遇到的问题前提:公司常