用Swing编写灵敏的图形用户界面

不灵敏的图形用户界面会降低应用程序的可用性。当以下现象出现的时候,我们通常说这个用户界面反应不灵敏。

不响应事件的现象;

没有更新的现象;

这些现象在很大程度上与事件的处理方法相关,而在编写Swing应用程序的时候,我们几乎必然要编写方法去响应鼠标点击按钮,键盘回车等事件。在这些方法中我们要编写一些代码,在运行时去触发一些动作。常见动作包括查找,更新数据库等。在这篇文章中通过对一个实例的分析,介绍了一些基本概念,常见的错误以及提出了一个解决方案。

event-dispatching thread

我们一定要记住,事件响应方法的代码都是在event-dispatching thread中执行的,除非你启用另一个线程。

那么,什么是event-dispatching thread呢?单一线程规则:一旦一个Swing组件被实现(realized),所有的有可能影响或依赖于这个组件的状态的代码都应该在event-dispatching thread中被执行。而实现一个组件有两种方式:

对顶层组件调用show(), pack(), 或者setVisible(true);

将一个组件加到一个已经被实现的容器中。

单一线程规则的根源是由于Swing组件库的大部分方法是对多线程不安全的。

为了支持单一线程模型,Swing组件库提供了一个专门来完成这些与Swing组件相关的操作的线程,而这一线程就是event-dispatching thread。我们的事件响应方法通常都是由这一线程调用的,除非你自己编写代码来调用这些事件响应方法。在这里初学者经常犯的一个错误就是在事件响应方法中完成过多的与修改组件没有直接联系的代码。其最有可能的效果就是导致组件反应缓慢。比如以下响应按钮事件的代码:

String str = null;
this.textArea.setText("Please wait...");
try {
 //do something that is really time consuming
 str = "Hello, world!";
 Thread.sleep(1000L);
} catch (InterruptedException e) {
 e.printStackTrace();
}
this.textArea.setText(str);

执行之后的效果就是按钮似乎定住了一段时间,直到Done.出现之后才弹起来。原因就是Swing组件的更新和事件的响应都是在event-dispatching thread中完成的,而事件响应的时候,event-dispatching thread被事件响应方法占据,所以组件不会被更新。而直到事件响应方法退出时才有可能去更新Swing组件。

为了解决这个问题,有人也许会试图通过调用repaint()方法来更新组件:

final String[] str = new String[1];
this.jTextArea1.setText("Please wait...");
this.repaint();
try {
 Thread.sleep(1000L);
}catch(InterruptedException e) {
 e.printStackTrace();
}
str[0] = "Done.";
jTextArea1.setText(str[0]);

但是这一个方法没有起到预期的作用,按钮仍然定住一段时间,在察看了repaint()方法的源代码之后就知道原因了。

PaintEvent e = new PaintEvent(this, PaintEvent.UPDATE,
new Rectangle(x, y, width, height));
Toolkit.getEventQueue().postEvent(e);

时间: 2024-09-20 23:51:45

用Swing编写灵敏的图形用户界面的相关文章

Java图形用户界面设计(Swing)的介绍_java

前言 Swing是一个用于开发Java应用程序用户界面的开发工具包.它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格.Swing开发人员只用很少的代码就可以利用Swing丰富.灵活的功能和模块化组件来创建优雅的用户界面. Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕显示元素.它们用纯Java写成,所以同Java本

AKFAvatar 0.21.2发布 有趣图形用户界面软件

AKFAvatar是一个文本信息导向的有趣http://www.aliyun.com/zixun/aggregation/18378.html">图形用户界面软件,它用一个头像显示在桌面上来给用户提示,还支持录制音频文件. 采用Lua编写,界面是由C++++.Free Pascal和GNU Pascal开发.提供一些准备使用的应用程序和模块,包括一个文本阅读器和模块来进行问题的答案练习. AKFAvatar 0.21.2版本设置 title/shortname再次运行,filechoose

AKFAvatar 0.21.1发布 有趣的图形用户界面软件

AKFAvatar是一个文本信息导向的有趣http://www.aliyun.com/zixun/aggregation/18378.html">图形用户界面软件,它用一个头像显示在桌面上来给用户提示,还支持录制音频文件. 采用Lua编写,界面是C++++,Free Pascal和GNU Pascal开发.提供一些准备使用的应用程序和模块,包括一个文本阅读器和模块来进行问题的答案练习. AKFAvatar 0.21.1版本进行了一些性能优化和错误修正,变更了C-API,添加miltilin

用户界面的视觉设计:图形用户界面(GUI)设计真实感

文章描述: 用户界面的视觉设计  用户界面的视觉设计的历史,可以描述成是一个逐渐向真实感变化的过程.就如同计算机已经变得越来越快一样,设计师增加了越来越多的现实的细节--比如色彩.立体效果.阴影.半透明甚至于简单的物理学原理.这些改变中有一部分已经帮助提高了界面的可用性.WINDOWS界面中窗口背后的阴影让我们知道哪个是当前窗口.iPhone手机用户界面的物理学体验令设备用起来更自然. 在其它领域,改善还值得商榷.图形用户界面(GUI)是最典型的例子.你在你的屏幕上看到的很多图形元素都是为了表达

嵌入式Linux系统图形及图形用户界面

本文首先概述了 Linux 图形领域的基本设施,然后描述了一些可供嵌入式 Linux 系统使用的高级图形库以及图形用户界面支持系统.希望对嵌入式 Linux 系统的开发有所帮助. 1 Linux 图形领域的基础设施 本小节首先向读者描述 Linux 图形领域中常见的基础设施.之所以称为基础 设施,是因为这些系统(或者函数库),一般作为其他高级图形或者图形应用程 序的基本函数库.这些系统(或者函数库)包括:X Window.SVGALib. FrameBuffer 等等. 1.1 X Window

使用NetBeans进行J2ME开发(四):高级图形用户界面

本来我介绍完J2ME的低级图形界面Canvas就想直接跳到游戏开发API,但是为了内容的完整性,我决定还是把高级图形用户界面简单介绍一下.不过重点不一样,我不会很详细的将各个类怎么使用,我只是向大家演示一下NetBeans的可视化开发功能和高级图形用户界面在手机上的运行效果.让图片说话吧. 1.在项目中新建MIDlet的时候,选择Visual MIDlet,如下图: 2.弹出可视化设计界面,如下图:

使用NetBeans进行J2ME开发(三):低级图形用户界面Canvas

在这一篇中,我将向大家介绍图形用户界面中的低级图形用户界面.所谓低级图形用户界面,指的是那种我们可以自己在上面画图的控件,它是和TextBox,List等等这些用户控件刚好相对的概念,因为这些用户控件的形状是事先画好的,无需我们程序员操心,所以称为高级图形界面.低级图形用户界面什么东西都需要我们自己画,所以比较复杂,当然也更加灵活,只有想不到,没有画不出,所以我们先介绍它. 在J2ME开发中,低级图形用户界面是由javax.microedition.lcdui.Canvas类实现的,我们只要继承

《树莓派Python编程入门与实战》——2.3 使用Raspbian图形用户界面

2.3 使用Raspbian图形用户界面 树莓派Python编程入门与实战 默认情况下,当你启动树莓派并登录后会进入到Linux命令行.但是树莓派同样还有一个图形用户界面(GUI,Graphical User Interface). 为了打开图形界面,你需要在命令行键入startx并且回车.然后轻量级的X11桌面环境(LXDE,Lightweight X11 Desktop Environment)就启动了,你可以看到一个类似图2.1的图形界面. 提示: Linux桌面环境 一个关于Linux的

Camelot 11.11.16发布 Python图形用户界面框架

Camelot是一个Pythonhttp://www.aliyun.com/zixun/aggregation/18378.html">图形用户界面框架,用于快速构建桌面应用程序,只需简单添加一些额外信息到你的模型定义.Camelot是建立在SQLAlchemy和PyQt的基础上,由Django admin界面受启发而设计的.该框架包含自定义字段类型和图像编辑.电子邮件地址.丰富的文字,等等. Camelot 11.11.16该版本主要带来了新样式,使用迭代器在模式和GUI这间通信.添加一