关于swing多线程理解
来源:互联网 发布:对对子软件下载 编辑:程序博客网 时间:2024/05/20 20:22
1.swing介绍
Swing是SUN推出的轻量级的开发用户界面的工具包,最初它的设计是在单线程环境下运行的,它的执行也是单线程的,这也就是为什么我们说Swing不是多线程安全的。所以为了编写交互性更高的UI界面,必须了解其内部的线程运行机制。
Swing程序往往包括了三种类型的线程,而且运行一个Swing应用程序,都会自动创建三个线程,分别是:
1)初始化线程:
它运行程序的主方法
2)事件调度线程:
它负责捕获系统事件
3)任务线程:
捕获的事件将发送到这一个线程做处理。
2.swing模式
所有的事件(如键盘按下、鼠标移动)都放置到一个事件队列中。Java.awt.EventQueue对象负责从这个队列中取出事件并适当地派发它们。EventQueue的派发机制由单独的一个线程管理,这个线程称为事件派发线程(EDT,Event Dispatch Thread)。
比如在JTextField按下一个键,EDT把这个按键事件派发到这个组件的键监听器。这个组件接着更新他的模式(执行actionPerformed方法),并把一个绘制请求发布到事件队列(EventQueue)。EDT从这个队列中取出这个绘制请求并再次通知这个组件,让它重新绘制自身。
3.swing实例
package window;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.event.ChangeEvent;import javax.swing.event.ChangeListener;import javax.swing.JTextField;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import javax.swing.JLabel;import javax.swing.JSlider;public class aa extends JFrame implements ChangeListener {private JPanel contentPane;public JTextField textField;private JTextField textField_1;private String ss;public JSlider slider;/** * Launch the application. */public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {aa frame = new aa();frame.setVisible(true);Thread thread = new My();thread.start();} catch (Exception e) {e.printStackTrace();}}});}/** * Create the frame. */public aa() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 450, 300);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(null);textField = new JTextField();textField.setBounds(150, 100, 142, 21);contentPane.add(textField);textField.setColumns(10);new Thread(new Runnable() {@Overridepublic void run() {try {for (int i = 0; true; i++) {textField.setText(String.format("当前进度:%s", i));Thread.sleep(200);}} catch (InterruptedException e) {e.printStackTrace();}}}).start();textField_1 = new JTextField();textField_1.setColumns(10);textField_1.setBounds(150, 42, 142, 21);contentPane.add(textField_1);JButton btnNewButton = new JButton("\u767B\u5F55");btnNewButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {if (ss == null) {ss = "s";} else {ss += "s";}System.out.println(slider.getValue());}});btnNewButton.setBounds(104, 137, 95, 25);contentPane.add(btnNewButton);JLabel lblNewLabel = new JLabel("\u8D26\u53F7:");lblNewLabel.setBounds(82, 45, 30, 15);contentPane.add(lblNewLabel);JLabel label = new JLabel("\u5BC6\u7801:");label.setBounds(82, 105, 30, 15);contentPane.add(label);slider = new JSlider();slider.setBounds(121, 194, 200, 24);contentPane.add(slider);textField_1.setText("" + slider.getValue());new Thread(new Runnable() {@Overridepublic void run() {try {for (int i = 0; true; i++) {textField_1.setText(String.format("当前进度:%s", i));Thread.sleep(100);}} catch (InterruptedException e) {e.printStackTrace();}}}).start();JButton button = new JButton("\u767B\u5F55");button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println("sss");}});button.setBounds(226, 137, 95, 25);contentPane.add(button);slider.addChangeListener(this);}@Overridepublic void stateChanged(ChangeEvent e) {textField_1.setText("" + slider.getValue());System.out.println(slider.getValue());}}
阅读全文
0 0
- 关于swing多线程理解
- 关于多线程的理解
- Swing多线程
- swing多线程
- 关于多线程的个人理解
- 关于Python多线程的理解
- 关于Java多线程的理解
- SWING 中关于UI线程的理解 ver 0.8
- Swing多线程编程
- Swing中的多线程
- Swing与多线程-小结
- Swing中的多线程
- Swing多线程编程
- Swing多线程编程
- swing中多线程
- Swing多线程编程
- Swing多线程编程
- 关于Silverlight中的多线程的理解
- CGD 部分API应用实例
- WordPress版微信小程序2.0版本发布
- ERP项目介绍——适合刚学完SSH的朋友
- public protected private 三种权限区别
- java多线程基础一
- 关于swing多线程理解
- Windows下Nginx无法启动的问题
- SEandroid 安全机制---文件安全上下文
- Mysql基本语句
- SPOJ 287 网络流最大流+二分答案 解题报告
- 计数排序的另一种实现(Python)附python中defaultdict方法的使用
- Linux学习基础篇(四)
- 线程间的通讯(wait和notify)
- LeetCode | 5. Longest Palindromic Substring