- 浏览: 1656401 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 3160今天用StringUtils#split,陷入了前两个坑。需求 ... -
使用scala.sys.process包和系统交互
2011-07-19 00:00 6498在Java中我们可以使用Runtime.getRuntime( ... -
HttpClient Json请求工具
2011-05-05 18:32 17854发送Json请求,结果返回Json. public sta ... -
利用Java反射实现通用的Excel报表
2011-04-12 16:00 2022最近有很多客户报表需要提供客户下载,需要生成一个Excel的格 ... -
深入异常处理
2011-03-31 20:46 1808异常处理是写一个健壮 ... -
Java序列化注意一些点
2011-03-12 21:04 18521.序列化ID的问题: 标示了版本号,版本号一致才能反序列化成 ... -
Java动态代理
2010-09-24 00:34 4469Java提供了动态代理,可以完成AOP和装饰模式的功能,主要的 ... -
Java Timestamp是和ExtJS的timestamp不兼容
2010-08-09 20:33 3357Timestamp纳秒级别的,ExtJS的timestamp使 ... -
XML DocumentBuilder#parse(String str)
2010-07-06 15:55 3893DocumentBuilderFactory dbf = ... -
[备忘]String#split/substring的子串会共享原来大的String
2010-03-29 17:18 1499如果每次需要大字符串中的很小的一个字串,可能会引起内存中大量的 ... -
runtime.exec()执行进程block死锁问题
2010-01-18 21:39 5296最近在java代码中使用runtime.exec执行rsync ... -
URL中文问题
2010-01-08 14:46 10531最近使用HttpClient,和Java的java.net.U ... -
A TaskExecutor Impl
2009-12-07 11:33 1631import java.util.ArrayList; im ... -
使用XStream把Java对象XML/JSON格式的序列化和反序列化
2009-05-05 11:37 6244试了一下Thoughtworks的XStream,以测试驱动和 ... -
从《编程的未来》这篇文章想到C++和Java语言的爽与不爽
2009-05-01 23:44 3976从编程的未来这篇文 ... -
《Effetive Java》读书笔记二
2009-02-23 14:23 1604第二章 所有对象共有的 ... -
《Effetive Java》读书笔记一
2009-02-19 11:36 2188《Effetive Java》和 《Effective C++ ...
相关推荐
在布局方面,DevExpress提供了一系列的布局管理器,如`DockPanel Suite`和`GridControl`,它们可以帮助你创建灵活且可自定义的界面布局。DockPanel Suite允许你将窗口停靠在屏幕边缘,或者自由浮动,这与浏览器的...
React.js(React)是 Facebook 推出的一个用来构建用户界面的 JavaScript 库。...与前面提及的框架不同,出于灵活性考虑,React使用JavaScript来构建用户界面,没有选择HTML。 标签:ReactJS
本教程旨在教授开发者如何通过结合Android SDK与XML技术来构建具备高度灵活性及动态化的用户界面(UI)。通过本教程的学习,读者将掌握从Android应用程序与Web服务器之间通过HTTP(S)进行通信的方法,到使用DOM解析器...
"Flex_Demo"可能是smartrcp的一个示例项目,展示了如何使用Flex技术来构建动态、灵活的用户界面。Flex是一种用于创建富互联网应用程序(RIA)的技术,它可以与smartrcp结合,为桌面应用提供类似Web的用户体验。 另...
同时,这个项目也体现了Qt5的灵活性和可扩展性,因为即使是对现有流行界面的模仿,也可以根据需求进行个性化调整。 总之,“Qt模仿VS2015界面框架”是一个展示Qt5强大功能的实例,它为开发者提供了学习和实践GUI...
它采用了组件化、模块化的设计,使得开发者可以灵活地组合和重用组件,快速构建用户界面。 2. Vue的特点有哪些? 答:响应式系统、组件化、模块化、灵活性高、学习曲线平滑等。 3. Vue的数据绑定有哪些方式? 答:{{}} ...
Flutter是一个由Google开发的开源移动UI框架,用于创建高性能、高保真的移动应用。它允许开发者用单一的代码库来构建跨...7. **Widget**:Flutter使用Widget来构建界面,Widget是不可变的,这使得界面构建既简洁又高
在移动应用开发的浪潮中,JavaScript(JS)正以其灵活性和强大的生态系统,为Android界面的动态化构建提供了全新的解决方案。JS赋能Android界面动态化构建,意味着开发者可以利用JavaScript的强大能力,在运行时动态...
Vue框架是一套用于构建用户界面的渐进式框架,意味着它是一步一步构建和增加功能的,而非一开始就提供一个全功能的框架。开发者可以根据项目需求,决定使用Vue框架的哪些部分,这使得Vue非常适合不同规模的项目,...
首先,VC++中的界面设计主要依赖于MFC框架,它为开发者提供了构建Windows应用程序的类库。MFC基于C++,它封装了Windows API,使得创建窗口、控件和处理消息变得更为简单。在MFC中,每个窗口或对话框都是一个对象,...
在QT编程中,界面跳转是一项关键技能,用于构建多页面的应用程序,使得用户可以在不同的功能模块间自由切换。QT库提供了丰富的工具和组件来实现这一功能,主要依赖于信号与槽机制、QStackedWidget、QWizard以及...
在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)界面设计和界面美化的重要知识点,以及如何通过实际案例来...不断实践和探索,你会发现MFC是一个强大而灵活的工具,能够帮助你构建出专业级别的用户界面。
总的来说,"扩展界面一"、"扩展界面二"和"扩展界面三支持库"是软件开发中提升用户界面灵活性和功能性的关键工具。它们不仅简化了开发过程,也帮助开发者创造出更强大、更个性化的用户体验。理解并熟练运用这些支持库...
在IT领域,GUI(图形用户界面)是一种广泛用于软件应用中的设计模式,它允许用户通过图形元素如按钮、菜单、滚动条...无论你是初学者还是经验丰富的开发者,都能从中获益,体验IDL在构建图形界面时的强大功能和灵活性。
下面将详细介绍在构建这样的界面时会涉及的一些关键知识点。 1. **布局管理器**:在Android中,我们常用到的布局管理器有LinearLayout、RelativeLayout、ConstraintLayout等。它们用于组织和定位界面元素,如商品...
QML的灵活性和动态性使得构建复杂的交互式界面变得简单。 3. **Qt库**:Qt是一个C++库,提供了大量的API用于创建跨平台的桌面和移动应用程序。Qt支持Windows、Linux、macOS、Android和iOS等操作系统。Qt Quick是Qt...
微信小程序提供了多种组件,包括视图容器组件、基础内容组件、表单组件等,使得开发者能够灵活地构建出美观且交互性强的界面。 1. **视图容器组件**: - `view`:基础布局组件,用于组织和展示内容。 - `button`...
在表单构建器中,Bootstrap的作用主要体现在为表单元素提供美观的外观和交互效果,如输入框、按钮、选择框、复选框等,以及栅格系统用于灵活布局。 描述中提到的“可拖拽表单组件进行表单定制”是指用户可以通过...
Monkberry是一个强大的JavaScript库,专门设计用于构建高效、响应式的Web用户界面。作为一个轻量级的框架,它提供了一套简洁的API和组件系统,让开发者能够快速地创建交互丰富的网页应用。在这个详细的讨论中,我们...
组合界面应用程序块专注于构建灵活的、模块化的用户界面,使得用户可以根据自己的需求和任务选择不同的视图和功能。 在实际应用中,组合界面通常采用MVC(Model-View-Controller)或者MVVM(Model-View-ViewModel)...