全面比较AWT和Swing

全面比较AWT和Swing,第1张

比较AWT和Swing

AWT和Swing组件体系

a)Swing 通过在父组件上动态调用add()和remove()方法 来对组件树进行动态维护 因此 可以存在没有父组件的子组件

b)SWT 通过在构造函数的参数中 指定父组件 因此 不可能存在没有父组件的子组件

AWT和Swing组件绘制

a)Swing 通过调用组件的paint()方法来进行组件的绘制 组件进一步对他的子组件调用paint() 从而完成整棵组件树的绘制 通过子类化 重写paint()方法 可以完全定制一个组件的绘制

b)SWT SWT组件只是本地平台上实际组件的一个代理 实际组件采用win 编程方式进行绘制 绘制的过程不在JVM中完成 因此 子类化也不能对绘制进行完全定制 当SWT组件进行绘制时 他在完成了本地的绘制以后 会返回JVM 然后对所有已注册的PaintListener发出通知 因此 通过注册PaintListener可以对组件绘制进行一定程度上的修改

AWT和Swing事件模型

a)Swing中的事件会跟据当前的焦点进行发送 父组件不能对事件进行过滤 Swing中的事件监听器都是有类型的 因此每个组件所能支持的事件类型是通过方法名来限定的 不能扩展

b)SWT中的事件也是根据当前的焦点进行发送 父组件不能对事件进行过滤 SWT中支持有类型的监听器 也支持无类型的监听器 通过addListener(type listener) 我们可以为组件添加任何类型的监听器

AWT和Swing包设计

a)Swing是一个纯粹的组件库 他没有图形的 *** 作 他的绘制最终转发给Java D来完成

b)SWT包含了组件库和图形库 他的结构与AWT比较接近

其它

AWT和SWT实现原理不同 AWT控件相当于是一笔一画绣出来的 参加 java awt Component paint(Graphics g) 性能差 而SWT调用了 *** 作系统后台原生库 eclipse swt widgets Control类型中就没有类似的paint方法了 但是有一个接口 eclipse swt graphics Drawable 实现原理的不同带来了性能和用户视觉的差异

SWING 是基于AWT提供的MVC不完全实现 JFACE是基于SWT提供的MVC不完全实现 两者的核心作用都是提供了viewer和模型封装的概念 从设计实现层面看 SWING更加唯美一些 JFACE则更加侧重于实用 SWING和 JFACE两者都偏重于行为控制上下文 而对UI数据(例如 一个文本框控件中的内容)的管理都没有做太多的设计 JFACE中略有改进 提供了 setData的概念 JFACE是为了Eclipse而生的 虽然后来 RCP出来了 又做了其他的包装宣传 典型的体现就是提供了JFace Text Framework和其他一些用户构建Eclipse元素的UI支持 也提供了一些系统资源管理(ImageRegsitry ResourceManager等)等附加功能

lishixinzhi/Article/program/Java/hx/201311/26412

想修改看我的!继承重写保证OK!呵呵祝你成功!我现在就在用这个!

/

可编辑的日期控件

/

public class DateComboCellEditor extends CellEditor {

Date selectedDate;

DateCombo dateCombo;

private javatextDateFormat dateFormat = javatextDateFormat

getDateInstance();

private static final int defaultStyle = SWTNONE;

/

构造函数

/

public DateComboCellEditor() {

setStyle(defaultStyle);

}

/

构造函数

在哪个容器上构造

构造样式

/

public DateComboCellEditor(Composite parent, int style) {

super(parent, style);

}

/

创建控件

/

protected Control createControl(Composite parent) {

dateCombo = new DateCombo(parent, getStyle() | SWTREAD_ONLY);

dateCombosetFont(parentgetFont());

dateComboaddKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent e) {

keyReleaseOccured(e);

}

});

dateComboaddSelectionListener(new SelectionAdapter() {

public void widgetDefaultSelected(SelectionEvent event) {

applyEditorValueAndDeactivate();

}

public void widgetSelected(SelectionEvent event) {

selectedDate = dateCombogetDate();

}

});

dateComboaddTraverseListener(new TraverseListener() {

public void keyTraversed(TraverseEvent e) {

if (edetail == SWTTRAVERSE_ESCAPE

|| edetail == SWTTRAVERSE_RETURN) {

edoit = false;

}

}

});

dateComboaddFocusListener(new FocusAdapter() {

public void focusLost(FocusEvent e) {

DateComboCellEditorthisfocusLost();

}

});

return dateCombo;

}

/

取得控件值

/

protected Object doGetValue() {

focusLost();

return selectedDate;

}

/

设计控件焦点

/

protected void doSetFocus() {

dateCombosetFocus();

// ((CellEditor) dateCombogetData())setFocus();

}

/

@return 返回下拉框选择的日期

/

public Date getSelectedDate() {

return dateCombogetDate();

}

/

设置下拉框日期

@param date

此日期设置到下拉框中

/

public void setSelectedDate(Date date) {

dateCombosetDate(date);

}

/

取得控件要展现的布局

/

public LayoutData getLayoutData() {

LayoutData layoutData = supergetLayoutData();

if ((dateCombo == null) || dateComboisDisposed()) {

layoutDataminimumWidth = 60;

} else {

GC gc = new GC(dateCombo);

layoutDataminimumWidth = (gcgetFontMetrics()

getAverageCharWidth() 10) + 10;

gcdispose();

}

return layoutData;

}

/

设置控件日期

/

protected void doSetValue(Object value) {

AssertisTrue(dateCombo != null && (value instanceof String));

try {

dateCombosetDate(dateFormatparse((String) value));

} catch (Exception e) {

eprintStackTrace();

}

}

void applyEditorValueAndDeactivate() {

// Object newValue = doGetValue();

selectedDate = dateCombogetDate();

markDirty();

boolean isValid = isCorrect(selectedDate);

setValueValid(isValid);

fireApplyEditorValue();

deactivate();

// selectedDate = dateCombogetDate();

// markDirty();

// fireApplyEditorValue();

// deactivate();

}

/

控件丢失焦点

/

protected void focusLost() {

if (isActivated()) {

applyEditorValueAndDeactivate();

}

}

}

可以使用标准窗口小部件工具箱(Standard Widget Toolkit SWT)和 JFace 库来开发用于 Eclipse 环境的图形用户界面 而且还可以将它们用于开发单独的 GUI 本机应用程序 在本文中 我将介绍一些基本的 SWT(基本 GUI 对象的名称)类型 并展示如何综合使用它们来创建有用的应用程序 关于 Eclipse SWT 和 JFace 正如 Eclipse 的 Web 站点上所提到的 Eclipse 是一种通用工具平台 它是一个开放的 可用于任何东西的可扩展 IDE 没什么特别之处 它为工具开发人员提供了灵活性以及对软件技术的控制 Eclipse 为开发人员提供了生产大量 GUI 驱动的工具和应用程序的基础 而这项功能的基础就是 GUI 库 SWT 和 JFace SWT 是一个库 它创建了Java 版的本地主机 *** 作系统 GUI 控件 它依赖于本机实现 这意味着基于 SWT 的应用程序具有以下几个关键特性 它们的外观 行为和执行类似于 本机 应用程序 所提供的窗口小部件(widget)反映了主机 *** 作系统上提供的窗口小部件(组件和控件) 主机 GUI 库的任何特殊行为都在 SWT GUI 中得到反映 这些目标使得 SWT 不同于 Java 技术的 Swing Swing 的设计目标是消除 *** 作系统的差异 SWT 库反映了主机 *** 作系统的基本窗口小部件 在许多环境下 这种方法太低级 JFace 库有助于向 SWT 应用程序中添加大量服务 JFace 并没有隐藏 SWT 它只是扩展了 SWT 正如您将在这一系列的后面部分中看到的 SWT 最重要的扩展之一是 将应用程序的数据模型与显示及更改它的 GUI 隔离开来 在开始之前 我需要介绍一些 SWT 术语 Widget —— 基本的 SWT GUI 组件(类似于 Java AWT 中的 Component 和 Swing 中的 JComponent) Widget 是一个抽象类 Control —— 拥有 *** 作系统的对等物的窗口小部件(换句话说 在 *** 作系统中具有同一身份) Control 是一个抽象类 Composite —— 包含其他控件的控件(类似于 Java AWT 中的 Container 和 Swing 中的 JPanel) Item —— 其他控件包含的窗口小部件(该控件可能不是复合控件) 比如列表和表 注意 包含一些项的控件很少包含其他控件 反之亦然 Item 是一个抽象类 这些窗口小部件被安排在继承层次结构中 参见图 图 和图 了解它们是如何安排的 在图 中 Basic 类是来自本文的类 而其他所有类都是标准的 SWT 窗口小部件 图 SWT Widget 树 图 SWT Composite 树 图 SWT Item 列表

注意 Eclipse 具有跨平台特性(因此可以在许多 *** 作平台上运行) 本文基于 Eclipse 的 Microsoft Windows 版本 因此 本文包含的每个例子都应该能够不加任何更改地在其他平台上使用 还要注意的是 本文是基于 Eclipse V 的 Eclipse V 中添加了少许 GUI 窗口小部件类型和特性 基本控件 几乎所有 SWT GUI 都是从某些基础部分开始创建的 所有 SWT 窗口小部件都可以在 eclipse swt widget 或 eclipse swt custom 包中找到 (一些 Eclipse 插件还在其他包中提供了定制的窗口小部件 )窗口小部件包中包含一些基于 *** 作系统控件的控件 而定制包中则包含一些超出 *** 作系统控件集之外的控件 一些定制的软件包控件类似于窗口小部件包中的控件 为了避免命名冲突 定制控件的名称都是以 C 开始的(例如 比较 CLabel 与 Label) 在 SWT 中 所有控件(除了一些高级控件 比如 shell 将在后面进行讨论)在创建的时候都必须有一个父控件(一个复合实例) 在创建的时候 这些控件被自动 添加 到父控件中 这与必须明确添加到父控件中的 AWT/Swing 中的控件有所不同 自动添加产生了一种 自上而下 地构造 GUI 的方法 这样 所有控件都可以采用一个复合父控件(或者一个子类)作为构造函数的参数 大多数控件都有一些必须在创建时设置的标记选项 因此 大多数控件还有另外一个构造函数参数 我们通常称之为样式 该参数提供了设置这些选项的标记 所有这些参数值都是 static final int 并且都是在 eclipse swt 包的 SWT 类中定义的 如果不需要任何参数 则可以使用 SWT NONE 值 标签 标签可能是最简单的控件 标签 被用于显示纯文本(没有颜色 特殊字体或样式的文本)或称为图标的小图像 标签不接受焦点(换句话说 用户不能通过 Tab 键或鼠标移动到标签) 因此 标签无法产生输入事件 清单 展示了如何创建一个简单的文本标签 清单 创建一个带文本的标签import eclipse swt widget ;:Composite parent = ;:// create a center aligned labelLabel label = new Label(parent SWT CENTER);label setText( This is the label text );注意 该文本是采用不同于构造函数的单独的方法设置的 这是所有 SWT 控件的一个典型象征 只有父控件和样式是在构造函数中设置的 其他所有属性都是在已创建的对象上设置的 由于平台的限制 标准标签控件不能同时拥有文本和图标 为了支持同时拥有文本和图标 可以使用 CLabel 控件 如清单 中所示 清单 创建一个包含文本和图像的标签import eclipse swt graphics ;import eclipse swt widget ;import eclipse swt custom ;:Composite parent = ;Image image = ;:// create a left aligned label with an iconCLabel Clabel = new CLabel(parent SWT LEFT);label setText( This is the imaged label text );label setImage(image);

文本 在标签显示文本的同时 您时常还想允许用户插入文本 文本 控件就是用于此目的的 文本可以是单行的(一个文本字段) 也可以是多行的(一个文本区域) 文本还可以是只读的 文本字段中没有描述 因此 常常通过标签控件处理它们 以确定它们的用途 文本控件还可以包含一个 工具提示 提供关于控件用途的信息(所有控件都支持这一特性) 清单 显示了如何使用允许使用的有限数量的特性来创建一个简单的文本字段 选择默认文本是为了便于擦除 清单 创建一个包含选定的默认文本和一个限制条件的文本import eclipse swt widget ;:Composite parent = ;:// create a text fieldText name = new Text(parent SWT SINGLE);name setText( <none> );name setTextLimit( );name setToolTipText( Enter your name Last First );name selectAll(); // enable fast erase 按钮 通常 您希望用户指出应该何时进行某项 *** 作 最常见的做法是使用按钮 控件 存在以下几种样式的按钮 ARROW —— 显示为一个指向上 下 左 右方向的箭头 CHECK —— 已标记的复选标记 FLAT —— 没有凸起外观的按钮 PUSH —— 瞬时按钮(最常见的事件源) RADIO —— 具有排他性的粘性标记(sticky mark) 其他所有单选按钮都在相同的组中 TOGGLE —— 一个粘性按钮 清单 创建了一个 Clear 按钮 清单 创建一个按钮import eclipse swt widget ;:Composite parent = ;:// create a push buttonButton clear = new Button(parent SWT PUSH);clear setText( Clea&r );名称中的 & 导致利用紧接着的一个字母创建一个加速 允许通过 Ctrl+<字母> 顺序的方式按下按钮(控件顺序由主机 *** 作系统决定) 事件监听器 通常 您可能想在选择按钮(特别是某种推式按钮)的时候执行一些 *** 作 您可以通过向该按钮添加一个 SelectionListener(在 eclipse swt events 包中)做到这一点 当按钮状态发生改变时(通常是按钮被按下) 就会生成事件 清单 在单击 Clear 按钮时输出一条消息 清单 按钮事件处理程序import eclipse swt events ;:// Clear button pressed event handlerclear addSelectionListener(new SelectionListener() {public void widgetelected(selectionEvent e) {System out println( Clear pressed! );}public void widgetDefaultSelected(selectionEvent e) {widgetelected(e);}});此代码使用了一个匿名的内部类 但您还可以使用指定的内部类或单独的类作为监听器 多数包含两个或更多方法的 Listener 类还有一个类似的 Adapter 类 这个类提供了一些空的方法实现 并且可以减少您需要编写的代码数量 例如 还有一个 SelectionAdapter 类 这个类实现了 SelectionListener 注意 在这些方法中执行的 *** 作必须快速完成(通常不足一秒时间) 或者说 GUI 的反应将是迟钝的 更长时间的 *** 作(比如访问文件)需要单独的线程 但那是以后某期文章的主题

复合控件 至此 我们已经讨论了一些单独的控件 在多数 GUI 中 许多控件被组合在一起以提供丰富的用户体验 在 SWT 中 这种组合是通过 Composite 类实现的 复合控件可以在任何级别上进行嵌套 并且可以混合和匹配控件 将它们作为子控件进行组合 这样做可以极大地减少 GUI 开发的复杂性 并为 GUI 代码重用(通过封装内部 GUI)创造了机会 复合控件可以是有边界的 并且这些边界很容易在视觉上产生混淆 或者它们也可以是无边界的 无缝集成到更大的组中 清单 创建一个有边界的复合控件 单 创建一个有边界的复合控件

import eclipse swt widget ; : Composite parent = ; : Composite border = new Composite(parent SWT BORDER);

除了边界之外 Group 复合子类还支持标题 在定义排他性按钮集合时 组通常被用来包含单选类型的按钮 清单 创建了一个有边界的组 清单 创建一个有边界的组

import eclipse swt widget ; : Composite parent = ; : Group border = new Group(parent SWT SHADOW_OUT); border setText( Group Description );

shell shell 是一种可能没有父复合控件的复合控件(框架或窗口) 此外 它还有一个作为父控件的 Display 这通常也是默认设置 shell 有很多种样式 但最常见的样式是 SWT SHELL_TRIM 或 SWT DIALOG_TRIM shell 可以是模态的 也可以是非模态的 模态 shell 常常用于对话框 防止父 GUI(如果有的话)在关闭子 shell 之前被处理 清单 创建了一个框架样式的顶级非模态 shell 清单 创建一个顶级 shell

import eclipse swt widget ; : Shell frame = new Shell(SWT SHELL_TRIM); :

shell 可以有子 shell 这些子 shell 是与父 shell 相关的独立桌面窗口(也就是说 如果父 shell 关闭 那么其所有子 shell 也将关闭) 清单 创建了一个对话框样式的子 shell 清单 创建一个对话框 shell

: Shell dialog = new Shell(frame SWT DIALOG_TRIM); :

参见图 中具有 SWT SHELL_TRIMSee 的 shell 以及图 中具有 SWT DIALOG_TRIM 的 shell 了解这些值如何影响 shell 的整洁性 图 具有 SWT SHELL_TRIM 的 shell

图 具有 SWT DIALOG_TRIM 的 shell

  布局管理器 复合控件常常包含多个控件 可以使用以下两种方法安排这些控件 绝对定位 —— 为每个控件设置明确的 X 和 Y 位置 并通过代码设置一定的宽度和高度 托管定位 —— 每个控件的 X Y 宽度和高度都是通过LayoutManager 设置的

在多数情况下 应该选择使用 LayoutManagers 因为很容易调整它们来适应可变大小的 GUI SWT 也提供了一些布局管理器供您使用 在这一期的系列文章中 我们将讨论两种基本的布局管理器 FillLayout 和 GridLayout 在这两种情况下 每当重新设置复合控件的大小 都需要进行定位 一些布局管理器常常是专为某一个复合控件分配的 一些布局管理器只使用它们自身的参数就可以控制 而另一些布局管理器还需要其他参数 —— LayoutData 该参数是在它们管理的复合控件中的每个控件上指定的 FillLayout FillLayout 以行或列的形式安排控件 每个控件所设置的大小将与填充该复合控件所需的宽度和高度相同 在这些控件之间 空间是平均分配的 一种特殊情况是 在仅有一个子控件时 该控件的大小被设置为填充整个父复合控件的大小 清单 使用 FillLayout 创建一列控件

import eclipse swt widget ; import eclipse swt layouts ; : Composite posite = ; FillLayout fillLayout = new FillLayout(SWT VERTICAL); posite setLayout(fillLayout);

GridLayout GridLayout 提供了一个功能更强大的布局方法 该方法类似于使用 HTML 表的方法 它创建了 D 网格的单元格 可以将控件放置在一个或多个单元格中(可以称之为单元格跨越) 单元格的大小可以是相等的 或者是网格宽度或高度的某个给定可变百分比 可以将控件添加到某一行的下一个可用列中 如果这一行中没有更多的列 那么该控件将移动到下一行的第一列中 清单 创建了一个复合控件 该控件有两行和两个列 其中包含两个已标记的文本字段 这些列可以有不同的宽度 清单 创建一个控件表

import eclipse swt widget ; import eclipse swt layouts ; : Composite posite = ; GridLayout gridLayout = new GridLayout( false); posite setLayout(gridLayout); Label l = new Label(posite SWT LEFT); l settext( First Name: ); Text first = new Text(posite SWT SINGLE); Label l = new Label(posite SWT LEFT); l setText( Last Name: ); Text last = new Text(posite SWT SINGLE);

GridData 考虑一下这种情况 您需要指定每个控件如何使用其单元格中的剩余空间 为了给每个单元格提供这种精确控制 添加到 GridLayout 的托管复合控件的控件可以拥有 GridData 实例(LayoutData 的子类) 清单 设置了这些文本字段 以便采用所有可用的剩余空间(根据前面的清单) 清单 配置一个扩展到所有可用空间的布局

first setLayoutData(new GridData(SWT FILL SWT FILL true true)); last setLayoutData(new GridData(SWT FILL SWT FILL true true));

如果只是要显示的话

其实用compositesetBackgroundImage(image)就可以了

Image image=new Image(Device display,String path);

另,楼上的ImageTestclass,是你这个文件的BundleID,SWTResourceManager通过反射来找到你这个资源位置,然后通过资源位置找到位置。

gui 应用程序是软件的一种主要类型,所以java的gui库应该是标准化并被集成到jre平台中的。然而不同的 *** 作系统有不同的gui风格和组件集。有一些组件在所以平台上有相似的观感。这些共有组件如按钮,标签,文本域,单选框等被称为标准组件。不同的gui工具集提供了不同的组件集。gui工具集总是遵循不同的原则来选择组件类型和特征以实现。考察一个工具集,有两个不同的要素:组件类型和组件特征。

terms

首先让我图解两个数学概念:最大公约数和最小公倍数。三个集合代表不同的 *** 作系统。相交的部分是最大公约数,合并的部分是最小公倍数。

现在让我们来考察java gui工具集awt,swt和swing的区别

awt

awt 组件集遵循最大公约数原则,即awt只拥有所有平台上都存在的组件的公有集合。所以你在awt中无法获取如表或树等高级组件,因为它们在某些平台上不支持。awt的组件特征同样遵循这一原则。它只提高平台上公有的特征。例如awt按钮不能附着,因为在motif平台上,按钮是不支持的。

由于它低劣的组件集和特征,awt无法吸引开发者。它是sun不推荐使用的,只是为了确保向下兼容和支持swing。

swt

swt 最初的目标之一是为了提供比awt更为丰富的组件集。它遵循最小公倍数原则以提供一个各个平台上包含的组件的并集。思路是如果一个组件在某个平台上包含,那么swt就会包装它并用java代码和jni来调用它。如果一个组件在某一平台上不存在,它就会用继承并绘制composite的方式来模拟组件。一个 swt composite类似于awt的canvas。以这种方式,swt提供了较awt更为丰富的组件集。值得指出的是swt的jni封装不同于awt,它的模拟也不同于swing。

在组件特征方面,swt类似于awt。它遵循最小公倍数原则。在早期的swt版本中,swt按钮因为和awt同样的原因不支持附着。在之后的版本中,许多缺失的特征采用模拟的方式补全。但仍有许多特征无法采用纯粹的模拟实现。swt将组件的控制交给本地 *** 作系统。它难以扩展。只有例如图形装饰等特征可以借助模拟绘制来自定义实现。所以严格意义上将,swt组件的组件集和特征因其难于扩展而不如swing来得丰富。

swing

swing 是三者中最强大和灵活的。在组件类型上,它遵循最大公约数原则。由于swing可以控制自身gui系统的全部并有很好的可扩展和灵活性,它几乎可以创建所有你想象得到的组件。唯一的限制是它的awt容器。在swing中你还不能跨平台地实现真正的透明化和不规则矩形窗口,因为swing依赖于awt顶层容器例如applet, window, frame and dialog等。除此之外,swing几乎实现了所有平台上的标准组件。

在组件特征上,swing遵循最小公倍数原则。它拥有所有平台上可提供的组件特征。不仅如此,你还可以继承已有的swing组件并添加新的特性。

上面比较主要是在api级别上的。让我们将比较的焦点转移到实现细节上。awt,swt和swing的区别是swing是纯java实现,而swt和awt 是java和jni的混合。当然,它们的目标都是相同的,提供一个跨平台的apis。然而为了达到这一点,swt和awt不得不牺牲一些组件和特性以提供一个通用的apis。

awt

一个awt组件通常是一个包含了对等体接口类型引用的组件类。这个引用指向本地对等体实现。举javaawtlabel为例,它的对等体接口是 labelpeer。labelpeer是平台无关的。在不同平台上,awt提供不同的对等体类来实现labelpeer。在windows上,对等体类是wlabelpeer,它调用jni来实现label的功能。这些jni方法用c或c++编写。它们关联一个本地的label,真正的行为都在这里发生。作为整体,awt组件由awt组件类和awt对等体提供了一个全局公用的api给应用程序使用。一个组件类和它的对等体接口是平台无关的。底层的对等体类和jni代码是平台相关的。

swt

swt也使用jni的方法论来实现。但细节不同于awt。swt的拥护者听到人们拿swt和awt相提并论可是会很生气的,steve northover,swt之父,就曾为此抱怨过。

没错,它们是不同的。让我们深究swt的代码。在swt中,各个平台上唯一相同的部分是组件的接口,是类和方法的定义签名。所有的底层代码都是平台差异的。 swt为每个平台提供了os类。这个类用jni封装了许多本地apis。swt组件类通过把这些jni方法黏合在一起提供一个有意义的功能。

例如,在windows上,文本域的选择是由一个系统调用处理的。这个系统调用在windows的os类中作为一个本地方法实现。所以在windows平台的text的setselection方法中只用到了一个jni调用。

然而,在motif上,文本域的选择包含两个本地调用。swt就在motif的os类中实现了两个调用。所以在motif上组件类需要作两次调用来实现文本的选择。

现在你应该能看出swt和awt的最大不同了,它们使用了不同的对等体编程方式来消除平台差异。swt用java代码或有jni实现的java对等体来黏合系统调用。而awt把代码包含在对等体中,使情况复杂化了,我个人觉得swt的方法更加明智。

swing

到了swing这里,一切就变得清晰和直接了。除了顶层容器,swing的实现不依赖于具体平台。它掌管了所有的控制和资源。swing所需要的是事件输入来驱动系统,以及承接自顶层awt容器的图形处理,字体和颜色。普通的swing组件可以看作是awt容器的一块逻辑区域。它们并没有注册对等体。所有添加到同一顶层容器的swing组件共享它的awt对等体以获取系统资源,如字体,图形处理等。swing将组件自己的数据结构存储在jvm的空间中。它完全由自己管理画图处理,事件分发和组件布局。

由于awt和swt都持有对本地组件的引用,它们必须以正确的方式释放这些引用以避免内存泄露和jvm崩溃。awt将绝大多数资源管理任务交给系统,将开发者从单调乏味的资源管理中解救出来。然而这使得awt的实现复杂化了。一旦它实现了,开发者很少有机会犯错误并使他们的程序崩溃。

swt 用的是另一种方法。大体上,swt让开发者自己来管理资源。它的一条著名的规则是:谁创建,谁释放。因此开发者必须谨慎地显式调用dispose方法释放每一个由他创建的组件和资源。这简化了swt的实现模型,但把开发者摆在了因错误编码而易于造成程序崩溃这一风险之上。

模拟方式的区别

swt和swing在它们的实现上都使用了模拟。swt只模拟平台上缺失的组件。区别是swt的模拟更像是awt的canvas实现的模拟。swt的 composite类有它自己在 *** 作系统中相应的对等体。它从自己的对等体中获得所有它所需要的资源如图形处理的对象,字体和颜色等。它直接从 *** 作系统获取所有的事件并进行处理。然而,swing组件在 *** 作系统中没有相应的对等体。它只是一块顶层容器中的逻辑区域,实际上它从顶层容器的对等体中借用资源。 swing的事件并不是底层系统产生的事件。它们实际是由顶层容器处理awt事件所产生的伪事件。我们会在稍后的事件部分中详细介绍它。

图形层结构

另一个不同之处是swing组件的z-order系统是来自于awt组件的。如上所述,swing组件与顶层awt容器共享一个对等体。因此,swing组件也和顶层容器有相同的z-order。swt和awt组件都有不同于顶层容器的z-order,通常是高于顶层容器。故而如果awt组件和swing组件混合在一起的话,swing组件将可能被awt组件遮住。当 *** 作系统开始更新ui的时候,顶层容器和swing组件总是先于awt组件绘制。当它们完成绘制,awt组件会覆盖swing可能绘制过的地方。因此不提倡swing和awt组件的混用。如果有一个浮动的swing组件如菜单,awt组件很可能遮盖菜单。以上是awt,swt和swing的区别的介绍

以上就是关于全面比较AWT和Swing全部的内容,包括:全面比较AWT和Swing、用SWT-Datepicker控件如何自定义CellEditor、Eclipse中用SWT和JFace开发入门等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9588630.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存