• java笔记使用事件分配线程更新Swing控件


    使用事件分配线程更新Swing控件:

    Swing并不是线程安全的,如果在多个线程中更新Swing控件,则很可能造成程序崩溃。
    为了避免这种问题,可以使用时间分配线程来更新Swing控件。

    EventQueue 是一个与平台无关的类,它将来自于底层同位体类和受信任的应用程序类的事件列入队列。
    它封装了异步事件指派机制,该机制从队列中提取事件,然后通过对EventQueue调用dispatchEvent(AWTEvent)
    方法来指派这些事件(事件作为参数被指派)。该机制的特殊行为是与实现有关的。为了将Swing程序在事件分配
    线程中运行,需要使用invokeLater()方法:
        public static void invokeLater(Runnable runnable)
       此run方法应该在EventQueue上同步执行


    注意:事件分配线程永远不需要使用可能发生阻塞的操作,如IO操作
    --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3911806.html "谢谢--  
    代码实例:

    package com.xhj.thread;
    
    import java.awt.Button;
    import java.awt.EventQueue;
    import java.awt.Label;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    /**
     * 使用事件分配线程更新Swing控件
     * 
     * @author XIEHEJUN
     * 
     */
    public class EventThreadUpdateSwing {
        // 标识更新次数
        private int a = 0;
        private Label lable;
        private Button button;
    
        public void setLable(Label lable) {
            this.lable = lable;
        }
    
        public void setButton(Button button) {
            this.button = button;
        }
    
        public Label getLable() {
            return lable;
        }
    
        public Button getButton() {
            return button;
        }
    
        /**
         * 事件线程类
         */
        private class EnventThread implements Runnable {
    
            @Override
            public void run() {
                // 按钮监听,实现点击改变数值
                button.addActionListener(new ActionListener() {
    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // 利用EnventQueue类来更新Swing控件
                        EventQueue.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                lable.setText(a++ + " 新生成的随机数是:"
                                        + new Random().nextInt());
                            }
                        });
                    }
                });
    
            }
    
        }
    
        public static void main(String[] args) {
            EventThreadUpdateSwing etus = new EventThreadUpdateSwing();
            
            JFrame frame = new JFrame();
            JPanel panel = new JPanel();
            frame.setContentPane(panel);
            frame.setVisible(true);
            etus.setLable(new Label("点击按钮生成随机数"));
            etus.setButton(new Button("开始生成"));
            frame.add(etus.getLable());
            frame.add(etus.getButton());
            
            EnventThread envent = etus.new EnventThread();
            new Thread(envent).start();
    
        }
    }

    注:在EventQueue中还定义了一个invokeAndWait()方法、事件放入到队列时,invokeLater()方法立即返回结果,
    而run()方法在新线程中执行。invokeAndWait方法要等run()方法确实执行才会返回。SwingUtilities也提供了
    相同的方法。

    知识重在总结和梳理,只有不断地去学习并运用,才能化为自己的东西。由于本人进阶猿类时间尚短,故此博客即是我学习,工作的笔记,也是和大家交流,相互提升技术的平台~希望大家不吝赐教~~ --但管努力,莫问前程,事在人为,功不唐捐。--和佑博客园
  • 相关阅读:
    Codeforces 1528E Mashtali and Hagh Trees
    Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round)
    Codeforces 1517G Starry Night Camping
    Codeforces 1508E Tree Calendar
    Codeforces 1508D Swap Pass
    Codeforces 1511G Chips on a Board
    Codeforces 1511F Chainword
    Codeforces 1516E Baby Ehab Plays with Permutations
    CF1539A Contest Start 题解
    关于 manacher
  • 原文地址:https://www.cnblogs.com/XHJT/p/3911806.html
Copyright © 2020-2023  润新知