`

你构建灵敏的界面了么?

阅读更多
今天帮同学调试程序,发现许多同学初写GUI程序共同的毛病,不能够构建反映灵敏的界面,
并由此导致一些问题的出现。或许今天遇到的问题,再加上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);
   }
}

细心的同学还会发现第一段代码,按钮按下等到所有的信息一次全显现了的时候才抬起,
这往往是界面不灵敏的表现。
5
4
分享到:
评论
1 楼 yujiang 2008-03-17  
一般的Swing控件都不是线程安全的,
应该在Swing线程里面操作你的控件,
也就是一般应该用 SwingUtilities.invokeLater

相关推荐

    使用DevExpress构建多文档界面设计

    在布局方面,DevExpress提供了一系列的布局管理器,如`DockPanel Suite`和`GridControl`,它们可以帮助你创建灵活且可自定义的界面布局。DockPanel Suite允许你将窗口停靠在屏幕边缘,或者自由浮动,这与浏览器的...

    构建用户界面的JavaScript库ReactJS.zip

    React.js(React)是 Facebook 推出的一个用来构建用户界面的 JavaScript 库。...与前面提及的框架不同,出于灵活性考虑,React使用JavaScript来构建用户界面,没有选择HTML。 标签:ReactJS

    Android开发教程之使用_Android_和_XML_构建动态用户界面(一).

    本教程旨在教授开发者如何通过结合Android SDK与XML技术来构建具备高度灵活性及动态化的用户界面(UI)。通过本教程的学习,读者将掌握从Android应用程序与Web服务器之间通过HTTP(S)进行通信的方法,到使用DOM解析器...

    smartrcp入门视频系列三(快速构建程序界面)

    "Flex_Demo"可能是smartrcp的一个示例项目,展示了如何使用Flex技术来构建动态、灵活的用户界面。Flex是一种用于创建富互联网应用程序(RIA)的技术,它可以与smartrcp结合,为桌面应用提供类似Web的用户体验。 另...

    Qt模仿VS2015界面框架

    同时,这个项目也体现了Qt5的灵活性和可扩展性,因为即使是对现有流行界面的模仿,也可以根据需求进行个性化调整。 总之,“Qt模仿VS2015界面框架”是一个展示Qt5强大功能的实例,它为开发者提供了学习和实践GUI...

    VUE面试题,Vue是一套构建用户界面的前端框架 它采用了组件化、模块化的设计,使得开发者可以灵活地组合和重用组件

    它采用了组件化、模块化的设计,使得开发者可以灵活地组合和重用组件,快速构建用户界面。 2. Vue的特点有哪些? 答:响应式系统、组件化、模块化、灵活性高、学习曲线平滑等。 3. Vue的数据绑定有哪些方式? 答:{{}} ...

    Flutter Widget魔法:构建绚丽界面的秘诀

    Flutter是一个由Google开发的开源移动UI框架,用于创建高性能、高保真的移动应用。它允许开发者用单一的代码库来构建跨...7. **Widget**:Flutter使用Widget来构建界面,Widget是不可变的,这使得界面构建既简洁又高

    JS赋能Android界面动态化构建.zip

    在移动应用开发的浪潮中,JavaScript(JS)正以其灵活性和强大的生态系统,为Android界面的动态化构建提供了全新的解决方案。JS赋能Android界面动态化构建,意味着开发者可以利用JavaScript的强大能力,在运行时动态...

    Vue框架是一套用于构建用户界面的渐进式框架.txt

    Vue框架是一套用于构建用户界面的渐进式框架,意味着它是一步一步构建和增加功能的,而非一开始就提供一个全功能的框架。开发者可以根据项目需求,决定使用Vue框架的哪些部分,这使得Vue非常适合不同规模的项目,...

    VC++界面设计,教你如何做界面

    首先,VC++中的界面设计主要依赖于MFC框架,它为开发者提供了构建Windows应用程序的类库。MFC基于C++,它封装了Windows API,使得创建窗口、控件和处理消息变得更为简单。在MFC中,每个窗口或对话框都是一个对象,...

    qt 界面跳转 界面跳转 界面跳转

    在QT编程中,界面跳转是一项关键技能,用于构建多页面的应用程序,使得用户可以在不同的功能模块间自由切换。QT库提供了丰富的工具和组件来实现这一功能,主要依赖于信号与槽机制、QStackedWidget、QWizard以及...

    MFC界面设计和界面美化

    在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)界面设计和界面美化的重要知识点,以及如何通过实际案例来...不断实践和探索,你会发现MFC是一个强大而灵活的工具,能够帮助你构建出专业级别的用户界面。

    扩展界面一|扩展界面二|扩展界面三支持库

    总的来说,"扩展界面一"、"扩展界面二"和"扩展界面三支持库"是软件开发中提升用户界面灵活性和功能性的关键工具。它们不仅简化了开发过程,也帮助开发者创造出更强大、更个性化的用户体验。理解并熟练运用这些支持库...

    基于IDL的图形界面设计源代码

    在IT领域,GUI(图形用户界面)是一种广泛用于软件应用中的设计模式,它允许用户通过图形元素如按钮、菜单、滚动条...无论你是初学者还是经验丰富的开发者,都能从中获益,体验IDL在构建图形界面时的强大功能和灵活性。

    安卓界面之仿购物APP界面

    下面将详细介绍在构建这样的界面时会涉及的一些关键知识点。 1. **布局管理器**:在Android中,我们常用到的布局管理器有LinearLayout、RelativeLayout、ConstraintLayout等。它们用于组织和定位界面元素,如商品...

    Go-Got-qtGUIFramework一个利用Go和QML中构建跨平台GUI界面的框架

    QML的灵活性和动态性使得构建复杂的交互式界面变得简单。 3. **Qt库**:Qt是一个C++库,提供了大量的API用于创建跨平台的桌面和移动应用程序。Qt支持Windows、Linux、macOS、Android和iOS等操作系统。Qt Quick是Qt...

    《微信小程序开发图解案例教程》教学教案—第3章教案用微信小程序组件构建UI界面2.pdf

    微信小程序提供了多种组件,包括视图容器组件、基础内容组件、表单组件等,使得开发者能够灵活地构建出美观且交互性强的界面。 1. **视图容器组件**: - `view`:基础布局组件,用于组织和展示内容。 - `button`...

    表单构建器源码

    在表单构建器中,Bootstrap的作用主要体现在为表单元素提供美观的外观和交互效果,如输入框、按钮、选择框、复选框等,以及栅格系统用于灵活布局。 描述中提到的“可拖拽表单组件进行表单定制”是指用户可以通过...

    Monkberry一个用于构建Web用户界面的JavaScript库

    Monkberry是一个强大的JavaScript库,专门设计用于构建高效、响应式的Web用户界面。作为一个轻量级的框架,它提供了一套简洁的API和组件系统,让开发者能够快速地创建交互丰富的网页应用。在这个详细的讨论中,我们...

    Smart Client系列课程(12):利用组合界面应用程序块构建智能客户端应用程序(Video)

    组合界面应用程序块专注于构建灵活的、模块化的用户界面,使得用户可以根据自己的需求和任务选择不同的视图和功能。 在实际应用中,组合界面通常采用MVC(Model-View-Controller)或者MVVM(Model-View-ViewModel)...

Global site tag (gtag.js) - Google Analytics