`

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)

需要注意的,当你在Windows XP上运行这个程序,你会得到一个对话框显示javaw.exe出现了问题,需要关闭,你是否愿意发送错误报告到Microsoft?
 
 
 
 

分享到:
评论

相关推荐

    swt资源释放问题

    每当用户操作鼠标或键盘时,操作系统会根据鼠标单击的位置、当前焦点窗口等信息决定应该把事件放到哪个 GUI 程序的队列中。 在 GUI 程序中,需要用一个循环不停地去读取自己的事件队列,每当检查到有新的事件时,就...

    SWT Table单元格编辑功能

    其中,`Table`控件是SWT中最常用的数据展示组件之一,尤其适用于展示表格形式的数据。本文将深入探讨SWT `Table`控件中的单元格编辑功能,并通过实例代码进行详细解析。 #### 1. 创建TableEditor `TableEditor`是...

    C#中标准Dispose模式的实现

    C#中标准Dispose模式的实现 C#中标准Dispose模式的实现 C#中标准Dispose模式的实现 C#中标准Dispose模式的实现 C#中标准Dispose模式的实现 C#中标准Dispose模式的实现 C#中标准Dispose模式的实现 C#中标准Dispose...

    swt教程 有关SWT怎么应用

    在本文中,我们将深入探讨SWT(Standard Widget Toolkit)的应用,以及如何在Java应用程序中使用它。SWT是由IBM公司为Eclipse集成开发环境设计的一种图形用户界面(GUI)工具包,它通过JNI(Java Native Interface)...

    SWT配置 SWT配置 SWT配置 SWT配置 SWT配置

    在任何基于SWT的Java项目中,首要任务就是将SWT JAR文件添加到项目的Classpath中。这一步骤确保了编译器能够识别SWT类和方法。具体操作如下: - **创建Java项目**:首先,在IDE中创建一个新的Java项目。 - **指定...

    探讨C#中Dispose方法与Close方法的区别详解

    (这里用using或许更好)当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别? 在这里,要明确一下C#程序(或者说.NET)中的资源。简单的...

    SWT_全接触 SWT_全接触 SWT_全接触

    1. **Display**:Display是SWT中最顶层的容器组件,它负责与底层窗口系统之间的通信。在大多数情况下,一个应用程序只需要一个Display实例。 2. **Shell**:Shell是一个窗口组件,它可以包含其他的Composite和...

    swt table 实现换行

    根据提供的文件信息,可以看出本文主要讨论的是如何在 SWT (Standard Widget Toolkit) 的 Table 控件中实现文本换行的功能。SWT 是一个用于开发基于 Java 的桌面应用程序的工具包,它提供了丰富的用户界面组件来帮助...

    如何在SWT中使用AWT、SWING组件

    在SWT中使用AWT组件,你需要依赖`org.eclipse.swt.awt`包。通过` SWT_AWT`桥接类,可以将AWT组件嵌入到SWT环境中。以下是一个简单的例子: ```java Display display = new Display(); Shell shell = new Shell...

    SWT JFace 按键、事件、监听

    本文将详细介绍SWT中的按键及其对应的常量表、`KeyEvent`事件和`VerifyEvent`事件的相关知识,并通过示例进行说明。 #### 按键与对应的常量表 SWT定义了一系列的常量来表示不同的按键,这些常量通常用于按键事件的...

    java SWT教程

    SWT(Standard Widget Toolkit)是IBM为Eclipse开发的GUI库,它的设计目标是提供一个高效且可移植的API,能够与操作系统底层GUI平台紧密结合。SWT利用JNI(Java Native Interface)调用操作系统内核API,实现了Java...

    java swt自定义控件

    在SWT中,自定义控件通常继承自`org.eclipse.swt.widgets.Control`类或其子类,如`Composite`。`Control`类是所有SWT可视对象的基类,而`Composite`则可以作为一个容器,包含其他控件。 ### 3. 绘制控件 自定义控件...

    SWT开发教程1

    在SWT中,开发者可以使用各种组件来构建GUI,如Button、Text、Label、Shell、Composite、Tree、Table等。这些组件提供了丰富的事件处理机制,允许开发者响应用户的操作。例如,Button组件可以处理点击事件,Text组件...

    swt的简单代码

    4. Display与Shell:在SWT中,Display是整个GUI的顶级容器,所有的窗口(Shell)都必须在Display上创建。Shell代表应用程序的窗口,它是其他组件的容器。 5. SWT与JFace:JFace是建立在SWT之上的一层抽象,提供了...

    swt-jface入门

    Display是SWT中用于管理窗口系统的对象,而Shell则代表应用程序的主要窗口。以下是一个简单的SWT "Hello world"程序示例: ```java import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell...

    IBM GUI库SWT教程

    2. **Shell**:Shell是SWT中的顶级窗口,它包含了用户界面的所有内容。每个应用程序至少有一个Shell,但也可以有多个子Shell来创建弹出窗口或对话框。 3. **Widget**:Widget是SWT的基本构建块,包括按钮、文本框等...

    SWT创建Shell窗口

    首先,我们需要理解Shell在SWT中的含义。Shell是SWT中的顶级窗口,类似于其他GUI库中的Frame或Window。它是应用程序的主窗口,可以包含各种控件,如按钮、文本框等。创建Shell的基本步骤如下: 1. 引入SWT库:在...

    SWT --JAR 包

    当用户点击按钮时,不会发生任何事情,但展示了如何在SWT中创建基本控件。 总的来说,SWT是一个强大的GUI工具包,它结合了Java的跨平台特性和本地操作系统的性能优势。通过“SWT --JAR 包”,开发者可以轻松地在...

    swt小技巧,SWT的SHELL样式

    在SWT中,`Shell`对象是最基本的窗口容器,所有其他控件都必须放置在一个`Shell`对象内。`Shell`对象支持多种样式设置,通过这些样式可以定制窗口的行为和外观。 #### 二、SWT.SHELL样式详解 SWT中的`Shell`样式...

    swt开发所要的32位与64位lib库

    SWT(Standard Widget Toolkit)是Java编程环境中用于创建图形用户界面(GUI)的一个开源库,它是Eclipse基金会的一部分。SWT的设计目标是提供一个高效、本地化的GUI API,能够充分利用操作系统提供的功能,使得Java...

Global site tag (gtag.js) - Google Analytics