Swing UI线程安全操作

1. Timer的使用
举例:点击按钮,按进度条没隔一秒就增加十分之一

import java.awt.BorderLayout;

public class TestTimer extends JFrame {

    private JPanel contentPane;
    int value=0;
    private JProgressBar progressBar;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestTimer frame = new TestTimer();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TestTimer() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        progressBar = new JProgressBar();
        contentPane.add(progressBar, BorderLayout.NORTH);
        JButton btnRun = new JButton("start");
        btnRun.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                Timer timer = new Timer(1000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        value +=10;
                        progressBar.setValue(value);
                        if (value==100) {
                            value=0;
                        }
                    }
                });
                timer.setRepeats(true);
                timer.start();
            }
        });
        contentPane.add(btnRun, BorderLayout.CENTER);
    }
}

2. SwingWorker
举例:点击按钮,在文本框内获取网站的数据

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.concurrent.ExecutionException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
import javax.swing.border.EmptyBorder;

public class TestSwingworker extends JFrame {

    private JPanel contentPane;
    private JTextArea textArea;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestSwingworker frame = new TestSwingworker();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TestSwingworker() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JButton btnNewButton = new JButton("run");
        btnNewButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                webRead();
            }
        });
        contentPane.add(btnNewButton, BorderLayout.NORTH);

        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);

        textArea = new JTextArea();
        scrollPane.setViewportView(textArea);
    }
    public void  webRead() {
        new SwingWorker<StringBuilder,String>(){
            @Override
            protected StringBuilder doInBackground() throws Exception {
                URL url = new URL("http://www.baidu.com");
                URLConnection connection = url.openConnection();
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(connection.getInputStream(),"utf-8"));
                String line;
                StringBuilder builder = new StringBuilder();
                while((line = reader.readLine())!=null){
                    //publish(line);//调用process()方法
                    builder.append(line).append("\n");
                }
                reader.close();
                return builder;
            }

            @Override
            protected void process(List<String> chunks) {
                for (String line:chunks) {
                    textArea.append(line);
                    textArea.append("\n");
                }
                super.process(chunks);
            }

            @Override
            protected void done() {
                try {
                    //get得到的是doInBackground()返回值
                    textArea.setText(get().toString());
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                super.done();
            }

        }.execute();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值