Java的Swing编程中使用SwingWorker线程模式及顶层容器

  

Java的Swing编程中,使用SwingWorker线程模式以及顶层容器可以实现多线程的UI操作,避免了长时间运行的任务卡住了界面的情况。下面将详细介绍如何使用SwingWorker线程模式及顶层容器进行Swing编程。

一、SwingWorker线程模式

SwingWorker是Java提供的一个工具类,用于在后台线程中执行耗时的任务,并在任务完成后通知Swing应用程序。

1.创建SwingWorker类

public class SwingWorkerDemo extends SwingWorker<Void, Integer>{

    private JTextArea textArea;

    public SwingWorkerDemo(JTextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    protected Void doInBackground() throws Exception {
      int i = 0;
      while (i < 100) {
        Thread.sleep(100);
        i++;
        publish(i);           //在doInBackground中通过publish方法通知process方法
      }
      return null;
    }

    @Override
    protected void process(List<Integer> chunks) {   //在process方法中更新UI组件
      for (Integer chunk : chunks) {
        textArea.append(String.valueOf(chunk) + "\n");
      }
    }

    @Override
    protected void done() {        //在done方法中任务完成后通知Swing应用程序
      System.out.println("Done!");
    }
}

2.启动SwingWorker类

public class Main{

    public static void main(String[] args) {
        JTextArea textArea = new JTextArea();
        JFrame frame = new JFrame();    
        frame.add(textArea);
        frame.setSize(200, 300);
        frame.setVisible(true);

        SwingWorkerDemo worker = new SwingWorkerDemo(textArea);   //创建SwingWorker对象
        worker.execute();    //启动SwingWorker线程 
    }
}

二、顶层容器

顶层容器是Swing组件的一个父容器,如JFrame、JDialog等。使用顶层容器可以实现窗口的创建和UI布局等操作。

1.创建顶层容器

JFrame frame = new JFrame("My Frame");   //创建JFrame窗口
frame.setSize(500, 500);   //设置窗口大小
frame.setLocationRelativeTo(null);    //将窗口居中显示
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //设置关闭窗口时的操作

2.向顶层容器添加组件

JButton button = new JButton("Click me");
frame.add(button, BorderLayout.NORTH);

3.显示顶层容器

frame.setVisible(true);

三、整合SwingWorker线程模式和顶层容器

下面的示例实现了一个在SwingWorker线程中递增计数,在JFrame窗口中显示计数结果的功能。

public class Demo extends JFrame{

    private JTextArea textArea;

    public Demo() {
        textArea = new JTextArea();
        JButton button = new JButton("Start");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() {

                    @Override
                    protected Void doInBackground() throws Exception {
                        int i = 0;
                        while (i < 100) {
                            Thread.sleep(100);
                            i++;
                            publish(i);
                        }
                        return null;
                    }

                    @Override
                    protected void process(List<Integer> chunks) {
                        for (Integer chunk : chunks) {
                            textArea.append(String.valueOf(chunk) + "\n");
                        }
                    }

                    @Override
                    protected void done() {
                        System.out.println("Done!");
                    }
                };
                worker.execute();
            }
        });

        setLayout(new BorderLayout());
        add(button, BorderLayout.NORTH);
        add(textArea, BorderLayout.CENTER);
        setTitle("SwingWorker Demo");
        setSize(200, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Demo();
    }
}

以上就是关于Java的Swing编程中使用SwingWorker线程模式及顶层容器的攻略,希望能够帮助了解Swing编程的读者。

相关文章