关于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());}}


原创粉丝点击