`
yidongkaifa
  • 浏览: 4147605 次
文章分类
社区版块
存档分类
最新评论

Swing组件响应事件与自身重绘

 
阅读更多

先看段代码。

btn.setText("hello1");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

btn.setText("hello2");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

btn是一个JButton,这段代码写在btn按钮的响应事件(actionPerform)中,在这之前,btn按钮显示的文字是hello。点击按钮,会看到什么现象呢?按钮处于被按下的状态,两秒后,按钮弹起,文字显示的是hello2

这段代码模拟了一个情景,就是当Swing组件的事件响应中要执行一个比较长时间的操作时候,比如要操作数据库,会发生的情况。这个时候,实际上是事件响应操作完全完成以后,组件才重绘自身。这会给用户造成界面反映慢的感觉。对于AWT组件,不会出现这种情况,因为组件是先重绘自身,再响应事件。

而且,在这段代码执行的过程中,我们不会看到btn显示出hello1,而是直接显示出hello2

Swing组件的事件响应和自身重绘实际上是在一个线程中完成的。先是形成一个事件队列,包括事件响应,自身重绘;然后才开始按照队列来依次执行。这就是上面那段代码执行的效果的原因。

解决办法,我总结了一下,大概有四个。

第一个就是将事件响应相关代码另外开一个线程。例如操作数据库,那么就把对数据库的操作封装到一个新的线程来执行。

第二个解决方法。利用invokeLaterinvokeLater()的用意是,把要执行的内容以事件的形式排列到事件队列上,事件队列使Runnable接口执行。另外参见invokeAndWait

第三个。SUN公司针对这个问题,专门写了一个类,叫SwingWorker.java,用于在后台执行部分代码片断。不过没有包含在JDK中,要自己去下载包含到项目中。这个类就是用来简化这种经常需要编写多线程的程序的。

第四个,相对来说是编码最简单的。就是利用paintImmediately,这个方法能够让一个Swing组件立即刷新。例如上面的那段代码,如果利用paintImmediately,将改造成:

btn.setText("hello1");

btn.paintImmediately(0, 0, btn.getWidth(), btn.getHeight());

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

btn.setText("hello2");

btn.paintImmediately(0, 0, btn.getWidth(), btn.getHeight());

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

执行这段代码,将会看到,点击按钮以后,按钮立刻将文本更改为hello1,并且弹起。过一秒,按钮的文本就立刻更改为hello2

最后,放上来一些相关链接,他们写的比我清楚和深入的多。英文的,感兴趣可以看看。

http://today.java.net/pub/a/today/<chsdate w:st="on" isrocdate="False" islunardate="False" day="24" month="10" year="2003">2003/10/24</chsdate>/swing.html?page=1

http://today.java.net/pub/a/today/<chsdate w:st="on" isrocdate="False" islunardate="False" day="24" month="10" year="2003">2003/10/24</chsdate>/swing.html?page=2

http://www.javaworld.com/javaworld/jw-06-2003/jw-0606-swingworker.html

http://www.javaworld.com/javaworld/jw-06-2003/jw-0606-swingworker-p2.html

http://www.javaworld.com/javaworld/jw-06-2003/jw-0606-swingworker-p3.html

http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html

分享到:
评论

相关推荐

    JAVA中的控件重绘

    当我们谈论控件重绘时,我们通常指的是如何改变或更新已存在的组件外观,使其根据用户交互或其他事件进行刷新。下面将详细讨论这个主题,以及与给定的文件名相关的知识。 首先,`JAVA中的控件重绘`意味着我们要关注...

    按钮,列表框重绘.按钮,列表框重绘

    总结来说,按钮和列表框的重绘是GUI编程中的核心技能,它们涉及到用户界面的定制化、响应性以及视觉反馈的优化。通过熟练掌握这些技巧,开发者可以创建出更加美观且易用的应用程序。在实际项目中,我们应当根据具体...

    90个java-swing基础例子.zip

    7. **Swing构件的可定制性**:Swing组件高度可定制,可以通过重绘(override paintComponent())或设置属性来改变组件的外观和行为。 8. **对话框(Dialogs)**:Swing提供了JOptionPane,JOptionPane可以创建各种类型...

    JAVA 开发 Swing与多线程

    Swing的单线程模型基于"事件派发线程"(Event Dispatch Thread, EDT),所有Swing组件的渲染和事件处理都在这个线程中进行。这是因为GUI组件通常不支持线程安全的操作,多线程环境下可能会导致组件状态的不一致,...

    swing应用_cad绘图

    1. **Swing组件**:Swing提供了一系列的组件,如JButton、JLabel、JTextField、JFrame等,这些组件可以构建出功能齐全的用户界面。对于CAD绘图应用,可能需要使用JPanel来绘制图形,利用Graphics2D类进行绘图操作。 ...

    如何实现重绘

    而在Java的Swing或AWT中,可以使用`repaint`方法来请求组件的重绘。对于Qt这样的C++库,我们可以调用`update`函数达到相同的效果。 在Web开发中,DOM元素的样式更改会触发浏览器的重绘。通过CSS的`will-change`属性...

    JavaSwing贪吃蛇小游戏

    Java Swing贪吃蛇小游戏是一个利用Java的Swing库开发的经典娱乐项目,旨在帮助开发者加深对Swing组件和事件处理机制的理解。Swing是Java Standard Edition (J2SE)的一部分,提供了一组轻量级的GUI组件,使得在Java中...

    java swing ppt

    为了提高性能,开发者可以采用一些优化技巧,如减少重绘次数、使用缓冲图像、合理使用事件监听器等。 ### 结论 Java Swing为开发者提供了一个强大而灵活的工具包,用于创建功能丰富的图形用户界面。通过学习和掌握...

    基于Swing界面的打地鼠小游戏

    由于游戏中没有涉及数据库连接,我们可以专注于理解Swing组件、事件处理以及游戏逻辑。 1. **Java Swing简介** Java Swing是Java AWT(Abstract Window Toolkit)的扩展,提供了更多的用户界面组件和更丰富的功能...

    Java_Swing_with_Samples.pdf

    Swing组件必须在事件分派线程(Event Dispatch Thread, EDT)中更新UI,以确保UI响应性和一致性。 **示例**:使用`SwingUtilities.invokeLater`方法来确保代码在EDT中执行: ```java SwingUtilities.invokeLater(new ...

    swing框架详细讲解

    当需要更新界面或响应用户交互时,可以使用repaint方法来触发组件的重绘。repaint方法会向事件队列中添加PAINT事件,由EDT来处理。如果需要在非EDT线程中修改Swing组件,必须使用SwingUtilities的invokeLater或...

    Java2 Swing

    1. **性能优化**:合理使用Swing的事件队列和重绘机制,避免不必要的重绘操作,减少对CPU和GPU的负载。 2. **布局策略**:选择合适的布局管理器,并结合约束条件进行布局设计,确保界面在不同屏幕尺寸下的适应性。 ...

    Java Swing画图小练习

    在这个“Java Swing画图小练习”中,我们将探讨如何使用Swing组件来实现交互式的图形绘制,特别是涉及鼠标移动事件监听以及动态效果的实现。 首先,Swing 提供了 `JFrame` 类作为应用程序的主窗口,我们可以在这个...

    swing 植物大战僵尸

    例如,僵尸的移动可以通过在每次重绘时改变其位置来实现。 4. **用户交互**:Swing的事件处理机制是通过事件适配器(EventAdapter)和事件监听器来实现的。例如,我们可以为种植植物的按钮添加ActionListener,当...

    MyQQ.rar_Swing qq_java swing QQ

    同时,`repaint()`方法用于通知组件重绘,以显示最新的状态。 总的来说,Swing QQ项目涵盖了Java Swing的基本组件使用、事件处理、网络编程以及数据结构和算法的应用。通过学习和实践这样的项目,开发者可以深入...

    swing技巧很好的东西

    Swing组件大多遵循MVC模式,如JTable、JList和JTree等,它们有自己的模型(Model)来存储数据,视图(View)负责显示,控制器(Controller)处理用户交互。 7. **国际化支持**: Swing支持多语言环境,通过...

    Java Swing 小游戏 迷宫

    这些功能的实现需要额外的Swing组件,如JLabel显示时间或分数,以及事件监听器来响应特定的游戏事件。 总的来说,"Java Swing 迷宫"小游戏是一个结合了图形界面编程、事件处理、数据结构、算法和多线程技术的综合性...

    swing编码艺术

    10. **性能优化**:Swing应用可能需要处理大量的组件和用户交互,因此了解如何优化性能,如正确使用重绘(repaint)和重新布局(revalidate),避免阻塞EDT,以及使用轻量级组件等技巧是必要的。 通过深入学习和...

    Swing 移动矩形

    之后,通过调用`repaint()`方法,我们可以强制组件重绘,展示新的矩形位置。 4. **事件监听**: 为了响应用户的鼠标点击和拖动,我们需要添加事件监听器。例如,我们可以添加`MouseListener`和`...

    swing hacking code

    9. **Swing调试和性能优化**:文章可能讨论了一些调试Swing应用的技巧,以及如何通过减少重绘、缓存组件状态等方式优化性能。 10. **Swing外观(LookAndFeel)**:Swing支持更换系统默认的LookAndFeel,实现跨平台...

Global site tag (gtag.js) - Google Analytics