- 浏览: 1641552 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
今天帮同学调试程序,发现许多同学初写GUI程序共同的毛病,不能够构建反映灵敏的界面,
并由此导致一些问题的出现。或许今天遇到的问题,再加上Java GUI在循环中调用repaint的问题分析能够对初学Java GUI编程同学有所帮助。
我同学写的程序,把有问题那部分抽离出来,表述为下面一段代码:
这段代码本来想作的事情是,当按下开始按钮后,在textArea区域中每隔200毫秒追加
一行信息。但结果却是在textArea中一下打印出来了。
我们分析一下这个问题的原因:
当按下开始按钮时,响应该事件,开始执行
开始往textarea中每隔200毫秒追加一行信息,但事实上textarea要想反映出这种变化,肯定要repaint()。但是由于按下开始按钮这个事件还没有响应完,其他通知
textarea重绘的事件在消息队列中排在按下开始按钮这个事件之后,这样当按下开始按钮这个事件响应完毕后,才会响应通知textarea重绘的事件,然而这时候所有的信息都已经追加到textArea中的,所以所有的信息一次全显现了,而不是一条一条显示。
通常解决这个问题的方法是,把追加到textarea的操作放在一个线程中单独去做,在响应
按下开始按钮这个事件的代码中把这个线程开启:
细心的同学还会发现第一段代码,按钮按下等到所有的信息一次全显现了的时候才抬起,
这往往是界面不灵敏的表现。
并由此导致一些问题的出现。或许今天遇到的问题,再加上Java GUI在循环中调用repaint的问题分析能够对初学Java GUI编程同学有所帮助。
我同学写的程序,把有问题那部分抽离出来,表述为下面一段代码:
package edu.jlu.fuliang; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class ProblemTest extends JFrame{ private JTextArea textArea = new JTextArea(10,10); private JButton startButton = new JButton("Start"); public ProblemTest(){ JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(new JScrollPane(textArea),BorderLayout.CENTER); panel.add(startButton,BorderLayout.NORTH); startButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { ProblemTest.this.append(); } }); add(panel); setSize(300,300); setVisible(true); } public void append() { for (int i = 0; i < 20; i++) { textArea.append("Line " + i + "\n"); try { Thread.currentThread().sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { ProblemTest pt = new ProblemTest(); pt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
这段代码本来想作的事情是,当按下开始按钮后,在textArea区域中每隔200毫秒追加
一行信息。但结果却是在textArea中一下打印出来了。
我们分析一下这个问题的原因:
当按下开始按钮时,响应该事件,开始执行
public void actionPerformed(ActionEvent e) { ProblemTest.this.append(); }
开始往textarea中每隔200毫秒追加一行信息,但事实上textarea要想反映出这种变化,肯定要repaint()。但是由于按下开始按钮这个事件还没有响应完,其他通知
textarea重绘的事件在消息队列中排在按下开始按钮这个事件之后,这样当按下开始按钮这个事件响应完毕后,才会响应通知textarea重绘的事件,然而这时候所有的信息都已经追加到textArea中的,所以所有的信息一次全显现了,而不是一条一条显示。
通常解决这个问题的方法是,把追加到textarea的操作放在一个线程中单独去做,在响应
按下开始按钮这个事件的代码中把这个线程开启:
package edu.jlu.fuliang; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class ProblemTest extends JFrame{ private JTextArea textArea = new JTextArea(10,10); private JButton startButton = new JButton("Start"); private Thread thread = null; public ProblemTest(){ JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(new JScrollPane(textArea),BorderLayout.CENTER); panel.add(startButton,BorderLayout.NORTH); startButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { // ProblemTest.this.append(); thread.start(); } }); thread = new Thread(){ public void run(){ append(); } }; add(panel); setSize(300,300); setVisible(true); } public void append() { for (int i = 0; i < 20; i++) { textArea.append("Line " + i + "\n"); try { Thread.currentThread().sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { ProblemTest pt = new ProblemTest(); pt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
细心的同学还会发现第一段代码,按钮按下等到所有的信息一次全显现了的时候才抬起,
这往往是界面不灵敏的表现。
评论
1 楼
yujiang
2008-03-17
一般的Swing控件都不是线程安全的,
应该在Swing线程里面操作你的控件,
也就是一般应该用 SwingUtilities.invokeLater
应该在Swing线程里面操作你的控件,
也就是一般应该用 SwingUtilities.invokeLater
发表评论
-
Builder模式遇到继承
2013-10-13 13:48 0interface Self<T extends ... -
Builder模式遇到集成
2013-10-13 13:47 0package com.qunar.qss.business. ... -
JVM调优Step by Step
2012-02-02 17:38 0现代的JVM能够适应于各种应用和领域,每个应用和领域的使用 ... -
commons-lang StringUtils#split的坑
2011-12-31 10:11 3123今天用StringUtils#split,陷入了前两个坑。需求 ... -
使用scala.sys.process包和系统交互
2011-07-19 00:00 6453在Java中我们可以使用Runtime.getRuntime( ... -
HttpClient Json请求工具
2011-05-05 18:32 17824发送Json请求,结果返回Json. public sta ... -
利用Java反射实现通用的Excel报表
2011-04-12 16:00 1994最近有很多客户报表需要提供客户下载,需要生成一个Excel的格 ... -
深入异常处理
2011-03-31 20:46 1781异常处理是写一个健壮 ... -
Java序列化注意一些点
2011-03-12 21:04 18231.序列化ID的问题: 标示了版本号,版本号一致才能反序列化成 ... -
Java动态代理
2010-09-24 00:34 4414Java提供了动态代理,可以完成AOP和装饰模式的功能,主要的 ... -
Java Timestamp是和ExtJS的timestamp不兼容
2010-08-09 20:33 3335Timestamp纳秒级别的,ExtJS的timestamp使 ... -
XML DocumentBuilder#parse(String str)
2010-07-06 15:55 3859DocumentBuilderFactory dbf = ... -
[备忘]String#split/substring的子串会共享原来大的String
2010-03-29 17:18 1459如果每次需要大字符串中的很小的一个字串,可能会引起内存中大量的 ... -
runtime.exec()执行进程block死锁问题
2010-01-18 21:39 5249最近在java代码中使用runtime.exec执行rsync ... -
URL中文问题
2010-01-08 14:46 10483最近使用HttpClient,和Java的java.net.U ... -
A TaskExecutor Impl
2009-12-07 11:33 1597import java.util.ArrayList; im ... -
使用XStream把Java对象XML/JSON格式的序列化和反序列化
2009-05-05 11:37 6205试了一下Thoughtworks的XStream,以测试驱动和 ... -
从《编程的未来》这篇文章想到C++和Java语言的爽与不爽
2009-05-01 23:44 3943从编程的未来这篇文 ... -
《Effetive Java》读书笔记二
2009-02-23 14:23 1576第二章 所有对象共有的 ... -
《Effetive Java》读书笔记一
2009-02-19 11:36 2148《Effetive Java》和 《Effective C++ ...
相关推荐
React.js(React)是 Facebook 推出的一个用来构建用户界面的 JavaScript 库。...与前面提及的框架不同,出于灵活性考虑,React使用JavaScript来构建用户界面,没有选择HTML。 标签:ReactJS
它采用了组件化、模块化的设计,使得开发者可以灵活地组合和重用组件,快速构建用户界面。 2. Vue的特点有哪些? 答:响应式系统、组件化、模块化、灵活性高、学习曲线平滑等。 3. Vue的数据绑定有哪些方式? 答:{{}} ...
Vue.js 是一个流行的 JavaScript 框架,用于构建用户界面和单页面应用。它易于学习、灵活且功能强大,以下是一些 Vue 开发的基本步骤和概念: 1. 安装 Vue 你可以通过多种方式安装 Vue.js。常见的方式是使用 npm 或...
它旨在提供一组简单的工具,可用于构建任何复杂的管理界面。因此,首先您可以立即创建一个非常简单的应用程序,并为您的每个模型自动生成 CRUD 视图。但是,您可以更进一步,根据需要自定义这些视图和表单。 Flask-...
Graver 是一款高效的 UI 渲染框架,它以更低的资源消耗来构建十分流畅的 UI 界面。Graver 独创性的采用了基于绘制的视觉元素分解方式来构建界面,得益于此,该框架能让 UI 渲染过程变得更加简单、灵活。
一个出色的组件设计岂能没有易用易扩展的人机界面?Bootstrap为此提供了定制的jQuery内置插件。 用LESS构建 当传统的枯燥CSS写法止步不前时,LESS横空出世了。LESS中使用变量,嵌套,操作,混合编码,花费很小...
Gradle 是一个基于 Apache Ant 和 Maven 的构建工具,提供了一个灵活的方式来构建和管理项目。Gradle 使用 Groovy 语言来编写构建脚本,能够自动地管理依赖关系和编译过程。Gradle 广泛地应用于 Android 项目的构建...
使用React.js构建Web界面这是我的课程使用React.js构建Web界面的存储库。 完整的课程可在和 React是一个JavaScript库,用于创建显示动态数据的用户界面。 由于其可重用的组件和独特的数据呈现方法,因此您使用React...
React 是由Facebook开发和维护的一个用于构建用户界面的JavaScript库。它的核心理念是组件化,通过复用组件来提高开发效率和代码可维护性。 Vue.js 是一个渐进式JavaScript框架,用于构建用户界面。它非常灵活,可以...
tu-rstui-rs是一个Rust库,用于构建丰富的终端用户界面和仪表板。它的灵感来自于Javascript库bless-contrib和Go库termui 。库本身支持四种不同的后端来绘制到终端。您可以选择:任期锈盒交叉术语诅咒但是,某些功能...
什么是Vue.js? Vue.js是一种用于构建用户界面的渐进式JavaScript框架。它采用MVVM架构模式,提供了数据驱动和...Vue.js则更专注于构建用户界面,并提供了更简单的API和更灵活的工具,可以轻松地集成到现有的项目中。
JEPaaS低代码开发平台开源版 让软件开发人员和业务用户通过直观的可视化界面来构建应用程序 ,而不是传统的编写代码方式。 用户可以在开发平台灵活各个图形化控件,以构建业务流程、逻辑和数据模型等所需的功能,...
React · React 是一个用于构建用户界面的 JavaScript 库。 声明性:React 使创建交互式 UI 变得轻松。 为应用程序中的每个状态设计简单的视图,当数据发生变化时,React 将有效地更新和呈现正确的组件。 声明式视图...
超细Superfine是用于构建Web界面的最小视图层。 认为没有框架-没有状态机,效果或订阅-只是绝对的最低要求。 可以将其与您喜欢的状态管理库混合使用,也可以单独使用以获得最大的灵活性。 这是让您入门的第一个示例...
· React是一个用于构建用户界面JavaScript库。 声明式: React使创建交互式UI变得轻松自如。 为应用程序中的每个状态设计简单的视图,当数据更改时,React将有效地更新和呈现正确的组件。 声明式视图使您的代码更具...
Terra Mach是一个映射前端系统,用于为设备构建图形界面。 该项目专注于围绕统计数据(图形,图表),映射和用户输入的经验。当涉及到用户体验时,与用户交互的元素足够灵活以构建大多数常见体验。 该项目正在积极...
Vue.js是一款构建用户界面的渐进式JavaScript框架,它设计初衷是以简单和灵活的方式处理Web界面。Vue的核心库专注于视图层,使得开发者能够更轻松地构建数据驱动的Web界面。本教程将带领读者深入了解Vue.js的基础...
Solid是用于创建用户界面的声明性JavaScript库。 它不使用虚拟DOM。 相反,它选择将其模板编译为真实的DOM节点,并将更新包装在细粒度的响应中。 这样,当您的状态仅更新依赖于它的代码时,它将运行。 主要特征 具有...
Solid是用于创建用户界面的声明性JavaScript库。 它不使用虚拟DOM。 相反,它选择将其模板编译为真实的DOM节点,并将更新包装在细粒度的响应中。 这样,当您的状态仅更新依赖于它的代码时,它将运行。 主要特点 具有...