java edt,Java Swing 学问篇 - EDT

article/2025/10/12 12:39:05

Java Swing 常识篇之EDT

从毕业到现在用SWING已经一年多,在这里想总结一下过去学到的东西和经验,和各位兄弟姐妹们一起分享。在以后的文章中也会和大家一起来分享一些好的框架。说起JAVA SWING,普遍给人的感觉是“丑、慢、难”,丑是界面丑、慢是速度慢、难是开发难。其实熟悉LAF的同学都知道SWING确实不丑;说到‘慢’,SWING也不慢,只要懂得如何处理长时间的TASK,而不是什么都在EDT处理;说到难,只要我们有一套自己专门开发SWINGUI的类库,也不难了。所以在接下来的文章中,我将会和大家构建一个SWING UI FRAMEWORK(暂时称为:Fast-DUI),在这个Fast-DUI中将会整合SWING中的动画(淡入淡出、滑上滑下)、效果(shadow、drop-shadow)、感官(LookAndFeel)等等。构建这样的一个框架主要是为了能够快速地开发出“漂亮的、用户体验好的”桌面应用程序。好了,接下来马上开始。今天的这篇文章在Swing的应用中起到举足轻重的作用。这篇文章是开头篇,可能写得不好,感觉自己的写作水平,和小学生有得一比。

今天就一起来学习一下EDT(Event Dispatching Thread,字面上翻译成“事件分配线程”),那什么是EDT,EDT就简单地认为就是一个线程(特殊的线程),这个线程主要是管理着整个SWING GUI的事件,管理着整个UI界面(熟悉Java2D的朋友都知道,我们所看到的界面就是Java2D绘图绘出来的)。大家都知道,也许大学的时候,老师也会提到SWING不是线程安全的,不是线程安全的,那意味着我们用多线程的时候,要格外的小心,我们要把SWING里面东西的修改、获取独立放到一个线程上,但是这个刚好SWING的开发人员已经为我们解决了,我们不必自己管理一个额外的线程,我们只需要把他们放到EDT里面,下面我会举两个例子来说明一下如何使用EDT。

第一个例子来讲一下如果不在EDT中修改Swing的东西会出现什么问题,请看下面的例子:

pakage org.dui.sample

import java.awt.BorderLayout;

import javax.swing.JFrame;

import javax.swing.JTextField;

import javax.swing.SwingUtilities;

/**

* NotInEDTSample just demonstrates the usage of Swing EDT simply.

*

* @author Jimmy.haung(SZ Team)

* @since DUI (Mar 25, 2013)

*/

public class NotInEDTSample extends JFrame {

private static final long serialVersionUID = 1L;

private JTextField m_txt;

public NotInEDTSample() {

initGUI();

notInEDT();

}

/**

* Init the GUI

*/

public void initGUI() {

this.setTitle("a simple EDT Sample");

m_txt = new JTextField();

getContentPane().add(m_txt, BorderLayout.CENTER);

}

/**

* Process not under the EDT. 这里我启动了10个线程来改变m_txt的内容.

*/

private void notInEDT() {

for (int i = 0; i < 4; ++i) {

new Thread(new Runnable() {

@Override

public void run() {

while (true) {

m_txt.setText("我不在EDT中操作!");

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}).start();

}

}

/**

* Launch the application.

*/

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

try {

NotInEDTSample oFrame = new NotInEDTSample();

oFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

oFrame.setLocationRelativeTo(null);

oFrame.setSize(300, 200);

oFrame.setVisible(true);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

}

运行上面的程序,然后点击几下界面后,界面就‘死掉’了(大家可以Resize看一下,或者点击一下窗口的Close按钮),‘死掉’有可能是死锁造成的,只是可能,但是程序也没有报Exception,这就是不确定性,如果Swing的stub不在EDT里面运行,带给程序很多的不确定性。在我以前看到的项目中,由于EDT的原因,引发可各种不可预测的Exception。

如果我们将上面的程序稍微改一下,将notInEDT的方法改成下面的样子:

private void notInEDT() {

for (int i = 0; i < 4; ++i) {

new Thread(new Runnable() {

@Override

public void run() {

while (true) {

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

m_txt.setText("我在EDT中操作!");

}

});

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}).start();

}

}

通过修改是不是发现没前面的问题了。但是有一些新学的朋友会问,如果本来就在EDT中就不用再加入到EDT, 但是如何才知道当前的线程是否是EDT呢,请看SwingUtilities.isEventDispatchThread();想得多周到的开发Swing的人员!SwingUtilities、SwingUtilities2、SwingUtilities3这几个类在以后都会经常用到,非常方便。看了上面的例子,大家有什么感想呢?

下面我们接着来写一个例子,我们试想一下,如果在EDT中执行一些时间长的任务会怎样呢?

import java.awt.BorderLayout;

/**

* NotInEDTSample just demonstrates the usage of Swing EDT simply.

*

* @author Jimmy.haung(SZ Team)

* @since DUI (Mar 25, 2013)

*/

public class LongTaskSample extends JFrame {

private static final long serialVersionUID = 1L;

private JButton m_btn;

public LongTaskSample() {

initGUI();

initEventHandler();

}

/**

* Init the GUI

*/

public void initGUI() {

this.setTitle("a simple EDT Sample");

m_btn = new JButton("click me to process long task");

getContentPane().add(m_btn, BorderLayout.CENTER);

}

/**

* Bind the event to the component.

*/

public void initEventHandler(){

m_btn.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

longTask();

}

});

}

/**

* Use about five seconds to process this task.

*/

private void longTask() {

//为true,请看 #main(String[])

System.err.println(SwingUtilities.isEventDispatchThread());

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

/**

* Launch the application.

*/

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

try {

LongTaskSample oFrame = new LongTaskSample();

oFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

oFrame.setLocationRelativeTo(null);

oFrame.setSize(300, 200);

oFrame.setVisible(true);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

}

点击了按钮后,我们发现程序死掉了大约5秒后,就醒来了,这就是“装死”的现象。所以我们看到在EDT里面运行时间长的任务的结果会引发什么后果,就会觉得很慢。上面的两个例子只是说明了一丁点的问题。在大家以后的项目中将会遇到更多问题。那么现在的问题是如果来改善上面的问题,我们应该在其他的线程中执行时间长的任务,而在EDT只是负责界面的显示,以及界面数据的修改、获取等,这以后还会讲,在这里提示一下,SwingWorker可以很好解决上面的问题。马马虎虎终于完成了第一篇文章。如果新学的朋友,还是不懂得话,请看http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html。如果还是不明白,不要紧,以后会慢慢体会到的。前面的几篇的文章将会将一些Swing基本的东西,讲完基础的东西后将会开始我们的Fast-DUI之旅。预告一下,下一章将会是布局(Layout),如何简单使用布局管理器来实现复杂的布局。

这里先预告一下我们以后要构建Fast-DUI的LAF(这只是其中的一种Skin,大家可以根据自己的情况来改变Skin),如下图:

1116371231.jpg


http://chatgpt.dhexx.cn/article/OPKmWwLo.shtml

相关文章

edt嵌入式确定性测试_CallSerially EDT和InvokeAndBlock(第1部分)

edt嵌入式确定性测试 我们上一次在2008年解释了EDT背后的一些概念&#xff0c;因此&#xff0c;我们很高兴再次撰写有关EDT的文章&#xff0c;在开发人员指南以及有关Udemy的课程中都有关于EDT的部分&#xff0c;但是由于这是最重要的了解在Codename One中&#xff0c;它几乎没…

EDT部署功能介绍

EDT部署功能介绍 当你在开发EDT Web前段程序的时候&#xff0c;你需要接触到EDT部署操作&#xff0c;从而将生成好的RUIHandler和Service的目标代码部署复制到目标Web程序中。和大家所熟知的部署到应用程序服务器上不同&#xff0c;EDT的部署操作是将生成好的Java/JavaScript/…

EDT技术 ug - 第一章节 Getting Start

文章目录 引言TestKompress Compression LogicEDT FlowEDT IP generationEDT synEDT IP pattern gennerationATPG 熟悉工具batch mode执行系统命令 本系列介绍的是Tessent的EDT&#xff08; Embedded Deterministic Testing&#xff09;技术。 参考为EDT tessent的 TestCompre…

DIY01_NE555叮咚门铃

文章目录 项目简介电路原理一、555定时器电路结构及工作原理二、叮咚门铃电路工作原理 原理图与PCB图一、原理图二、PCB图1. 初版2. 改进版 实物图立创打板流程经验总结 项目简介 第一次尝试自己DIY一个小电路设计&#xff0c;笔者选择了相对简单的NE555叮咚门铃。在本篇博客中…

NE555波形发生器手把手教程之NE555内部结构(一)

通过ne555搭建的波形发生器 可实现方波、三角波、正弦波输出 工程链接&#xff1a;https://pan.baidu.com/s/1T-9bdnO1IrWUsjmRTl12zQ 提取码&#xff1a;py66 一、芯片介绍 参数 供应电压&#xff1a;4.5-18V 供应电流&#xff1a;10-15mA 输出电流&#xff1a;225mA (m…

NE555基本原理及相关公式的推导

NE555基本原理及相关公式的推导 基本原理公式推导 基本原理 NE555主要由分压电路&#xff0c;电压比较器&#xff0c;RS触发器三部分组成&#xff1b; 分压电路电压比较器RS触发器提供电压比较器比较电压根据触发信号输出高低电平用于输出矩形波 当 V A > 2 3 V c c V_A&g…

模电学习12. NE555 方波信号发生器

模电学习12. NE555 方波信号发生器 一、NE555 基本功能1. 基本作用2. 基本组成 二、NE555方波生成电路1. 基本原理2. 原理图3. 仿真&#xff08;1&#xff09;RP1 设置为10%&#xff08;2&#xff09;RP1设置为90% 4. 实际电路 一、NE555 基本功能 1. 基本作用 NE555是一款广…

mysql profile 工具Neor Profile

一、下载Download - Neor Profile SQL http://www.profilesql.com/files/download/sqlprofiler-4.1.1.exe Neor Profile 这款免费的mysql 分析工具&#xff0c;这个工具类似于一个代理 本地启动一个mysql 代理服务&#xff0c;类似于MyCat 二、安装完成配置 三、代码连接代…

蓝桥杯NE555定时器与频率测量

使用的是蓝桥杯单片机CT107D实训平台&#xff1a; 555定时器内部&#xff0c;有3个5K的电阻分压。 NE555是一个纯硬件的设计&#xff0c;一旦电路确定了&#xff0c;其功能也就定了。 在蓝桥杯的板子上&#xff0c;555定时器是一个信号发生电路&#xff0c;通过定位器Rb3可改…

NE555的使用与理解

NE555 一款模拟与数字信号的集成芯片&#xff0c;通过一个电容充放电来输出方波&#xff0c;电容充放电的快慢决定了NE555输出的方波的频率&#xff0c;再通过控制两个电阻的比值来改变其输出方波的占空比。 外观图 内部图 因为NE555中有三个电阻R且都为5K所以称为555&#x…

蓝桥杯单片机设计与开发⑬ ---NE555模块

一、555定时器&频率测量 1. 电路原理 NE555是一种时钟芯片&#xff0c;输出一定频率的脉冲信号。就其模块特性&#xff0c;简单点来说&#xff0c;该模块会根据Rb3电位器的阻值&#xff0c;在SIG脚输出相应的频率的脉冲信号。 第十届竞赛中对该模块设置了考点&#xff0c;…

NE555 Motor LED Chaser

文章目录 1.前言2.资料下载 1.前言 这个是从YouTube上搬运来的&#xff0c;如图所示 2.资料下载 所需材料 #1# 10k resistor 1 #2# 10k variable resistor 1 #3# 10uf capacitor 1 #4# 3mm blue led 4 #5# 3mm yellow led 4 #6# 3mm red led 4 #7# 3mm green led 4 #8# 3mm…

单片机蓝桥杯——NE555频率测量

原理: 对蓝桥杯单片机板子上NE555电路进行频率测量时&#xff0c;不需要任何的配置&#xff0c;整个单片机测量频率的过程中&#xff0c;跟NE555芯片没什么关系&#xff0c;归根结底考察的还是定时/计数器。但需要注意&#xff1a; &#xff08;1&#xff09;当用到NE555时&am…

蓝桥杯单片机-NE555模块

一、简介 1、NE555在开发板中用于输出频率可变&#xff0c;占空比不变的方波。 2、NE555是纯硬件的设计&#xff0c;通过电位器RB3可改变其信号输出频率。不需要编程实现其功能。 考点&#xff1a;使用定时器的计数模式测量NE555输出的频率 3、开发板上电路 NET SIG即接P34&…

NE555产生方波

NE555详解 上图是芯片的引脚图 上图是芯片的内部结构图&#xff0c;脚号与第一张图的引脚相对应 从结构图可以得出下表&#xff1a; 接下来看应用图; 这是从CSDN上得到的一个方波发生器的原理图&#xff0c;对齐进行分析&#xff1a; 原理图将6和2脚连在一起&#xff0c; 所…

如何使用NE555产生方波

NE555在很多电路设计中都会用到&#xff0c;常用来实现施密特触发器&#xff0c;单稳态触发器和多谐振荡器 常用的NE555是这种八脚的&#xff0c;大家可以看下引脚定义 首先我们来看下NE555的内部构造&#xff1a; C1和C2是两个运放比较器&#xff0c;内部的这三个电阻阻值都是…

NE555

555定时器是电子工程领域中广泛使用的一种中规模集成电路&#xff0c;它将模拟与逻辑功能巧妙地组合在一起&#xff0c;具有结构简单、使用电压范围宽、工作速度快、定时精度高、驱动能力强等优点。555定时器配以外部元件&#xff0c;可以构成多种实际应用电路。广泛应用于产生…

NE555振荡电路

NE555振荡电路 简介 NE555是属于555系列的计时IC的其中的一种型号&#xff0c;555系列IC的接脚功能及运用都是相容的&#xff0c;只是型号不同的因其价格不同其稳定度、省电、可产生的振荡频率也不大相同&#xff1b;而555是一个用途很广且相当普遍的计时IC&#xff0c;只需少…

蓝桥杯单片机(七)NE555

上一章讲了蓝桥杯单片机如何输出PWM波 蓝桥杯单片机(六)PWM 这一章讲解蓝桥杯单片机开发板上的NE555方波发射器的频率测量&#xff0c;这也是近几年的考点。 首先看原理图&#xff1a; 由数电的知识&#xff1a; NE555的周期T0.7(RaRb)C 频率f1/T图中R8为定值电阻&#xff0c…

NE555方波发生器

基础知识 NE555不需要进行编程&#xff0c;或者与单片机进行通信&#xff0c;它本身就能产生方波。方波的频率可以调节&#xff0c;只要改变电阻电容的值就可以了。 电路原理 方波产生在排针J3的15&#xff08;SIGNA&#xff09;脚上&#xff0c;方波的频率通过Rb3电位器进行调…