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编程的读者。

阅读剩余 67%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java的Swing编程中使用SwingWorker线程模式及顶层容器 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java任务定时执行器案例的实现

    下面我来详细讲解“Java任务定时执行器案例的实现”的完整攻略。 什么是Java任务定时执行器? 在Java中,我们经常需要定时执行一些任务,比如定时备份数据库、定时发送邮件等。而Java任务定时执行器就是用来进行这些定时任务的,它可以在指定的时间间隔内执行指定的任务。 Java任务定时执行器的实现方式 Java任务定时执行器有很多的实现方式,比如Timer…

    Java 2023年5月19日
    00
  • Java输出链表倒数第k个节点

    下面是Java输出链表倒数第k个节点的完整攻略: 理解题意意义:输入一个链表,输出该链表中倒数第k个节点的值。 考虑边界条件:输入的链表为空或k不能大于链表长度。 定义两个指针,分别指向链表头部。让其中一个从0开始,先走k步,另一个开始走。然后两个指针同步走,直到其中一个到达链表尾部。另一个指针此时就是链表倒数第k个节点。 编写代码: public List…

    Java 2023年5月26日
    00
  • Java实现医院管理系统

    Java实现医院管理系统完整攻略 简介 医院管理系统是一个涉及多种功能的系统,它包含的功能有:病人管理、医生排班、药品管理、患者预约挂号等。通过Java语言实现医院管理系统,可以大大提高医院管理的效率,同时也为医院的信息化建设做出了贡献。 技术选型 为了实现医院管理系统,我们需要选择适当的技术来支撑,具体如下: 后端框架:Spring Framework 数…

    Java 2023年5月19日
    00
  • SpringBoot2 实现JPA分页和排序分页的案例

    下面是关于“SpringBoot2 实现JPA分页和排序分页的案例”的完整攻略: 1. 简介 SpringBoot是一款轻量级的Java开发框架,它可以用来构建各种类型的Web应用程序。其中,JPA(Java Persistence API)是Java EE规范的一部分,用于管理Java对象和关系型数据库之间的映射关系。JPA的分页和排序功能在实际开发中非常…

    Java 2023年6月2日
    00
  • Java实现数据库连接池的方法

    Java实现数据库连接池是一种提高性能和应用程序响应能力的有效方法。下面为大家介绍几种常见的Java实现数据库连接池的方法。 使用Apache DBCP实现连接池 Apache DBCP是Java中最常用的开源连接池之一,它是一个开源项目,由Apache软件基金会支持。它使用轻量级语言Java实现,可以通过简单的配置使用。下面是使用Apache DBCP实现…

    Java 2023年5月19日
    00
  • Java ArrayList使用总结

    Java ArrayList使用总结 本文主要介绍Java ArrayList的使用方法,包括以下内容: ArrayList的定义和初始化 ArrayList的常用操作 ArrayList的遍历 ArrayList的常见问题及解决方案 1. ArrayList的定义和初始化 ArrayList是Java语言中的集合类,用于存储一组相同类型的元素。可以通过以下…

    Java 2023年5月26日
    00
  • 详解Java内存溢出的几种情况

    详解Java内存溢出的几种情况 Java是一种自动管理内存的语言,但是在极端情况下也有可能出现内存泄漏或内存溢出的问题。本文将详细讲解Java内存溢出的几种情况,包括示例说明。 什么是Java内存溢出 Java内存溢出指的是程序申请的内存量超出了JVM虚拟机规定的内存限制,导致JVM无法再为申请内存分配空间。这时程序会出现异常并中断执行。 几种引起Java内…

    Java 2023年5月27日
    00
  • SpringBoot实现阿里云短信发送的示例代码

    下面是详细讲解“SpringBoot实现阿里云短信发送的示例代码”的完整攻略,包含示例说明: 1. 注册阿里云短信服务 首先需要在阿里云官网上注册一个账号,进入控制台后选择开通短信服务。 开通短信服务后,获取AccessKey ID和AccessKey Secret。 2. 添加阿里云短信依赖 在SpringBoot项目中,使用Maven或Gradle添加阿…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部