首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwingWorker结束,PropertyChangeListener监听,但我如何回到EDT?

SwingWorker是一个Java多线程编程技术,用于在后台线程中执行耗时的操作,而不会阻塞GUI线程。当SwingWorker完成其任务时,它会自动将结果传递给其PropertyChangeListener监听器。如果您想回到EDT(事件分发线程),可以使用SwingWorker的done()方法来触发一个事件,然后在EDT中处理该事件。

以下是一个示例代码:

代码语言:java
复制
SwingWorker worker = new SwingWorker() {
    @Override
    protected Object doInBackground() throws Exception {
        // 执行耗时操作
        Thread.sleep(2000);
        return null;
    }

    @Override
    protected void done() {
        super.done();
        // 触发结果事件
        try {
            Object result = get();
            if (result != null) {
                JOptionPane.showMessageDialog(null, result.toString(), "Result", JOptionPane.INFORMATION_MESSAGE);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if ("state".equals(evt.getPropertyName())) {
            if (SwingWorker.StateValue.DONE.equals(evt.getNewValue())) {
                // 处理结果事件
                try {
                    Object result = get();
                    if (result != null) {
                        JOptionPane.showMessageDialog(null, result.toString(), "Result", JOptionPane.INFORMATION_MESSAGE);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
});

在这个示例中,我们创建了一个SwingWorker对象,并将其state属性设置为SwingWorker.StateValue.RUNNING。当SwingWorker完成其任务时,它会调用done()方法,该方法会触发一个PropertyChangeEvent事件,该事件将state属性设置为SwingWorker.StateValue.DONE。我们使用PropertyChangeListener监听器来处理该事件,并在事件处理器中调用get()方法来获取结果,并显示结果消息框。

如果您想在其他线程中调用SwingWorker,您可以在其他线程中创建一个SwingWorker对象,并将其传递给SwingWorkerexecute()方法,以便在后台线程中执行耗时的操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

idea插件开发指南_idea get set插件

如果今日可跳过,那么结束。...) 而DialogWrapper类的很多操作都会检测线程是否是EDT线程,如果不是EDT线程,那么就会阻止用户更新界面,所以我们需要重写这些会检查线程的操作,如果当前线程不是EDT线程,需要提交事件到EDT...然后给进度条增加监听,当进度条满的时候,使用EDT关闭对话框 更别忘记设置取消不可用。 在idea创建对话框面板的时候,需要根据配置设置进度条的初始值,最大值和最小值,并启动计时器。...然后是了解了idea中的消息系统,以及idea是如何实现的消息系统,idea中各个控件如何相互配合,多个线程之间的状态如何进行数据的传递,以及Idea对消息系统中发布订阅模型的客户化修改。...在对话框中了解到了swing中对于多个线程对相同数据的竞争是如何解决的,以及EDT线程是什么,如何避免EDT线程检测,如何正确的在EDT线程之外操作swing的界面。

5.6K20

JavaSwing_8.1:焦点事件及其监听器 - FocusEvent、FocusListener

此类存在的目的是方便创建监听器对象。 继承此类来创建 FocusEvent 监听器,并针对感兴趣的事件重写方法。(如果你实现 FocusListener 接口,则必须定义该接口中的所有方法。...使用扩展的类创建一个侦听器对象,然后使用组件的 addFocusListener 方法向组件注册该监听器。...要熟悉基本焦点概念或获取有关焦点的详细信息,请参阅如何使用焦点子系统。 本节说明如何通过在特定组件上注册FocusListener实例来获取焦点事件。...要获取许多组件的焦点状态,请考虑在KeyboardFocusManager类上实现PropertyChangeListener实例,如如何使用焦点子系统中的将焦点更改跟踪到多个组件中所述。...焦点从列表移回到文本字段。您刚刚完成了一个聚焦周期。

4.7K10
  • Flutter 粘合剂CustomScrollView控件

    老孟导读:快乐的51假期结束了,切换为努力模式,今天给大家分享CustomScrollView组件,此组件在以后的项目中会经常用到,CustomScrollView就像一个粘合剂,将多个组件粘合在一起,...CustomScrollView是使用Sliver组件创建自定义滚动效果的滚动组件,使用场景: ListView和GridView相互嵌套场景,ListView嵌套GridView时,需要给GridView指定高度,但我们希望高度随内容而变化...,controller使用PrimaryScrollController,这种机制带来的好处是父组件可以控制子树中可滚动组件的滚动行为,例如,Scaffold正是使用这种机制在iOS中实现了点击导航栏回到顶部的功能...controller为滚动控制器,可以监听滚到的位置,设置滚动的位置等,用法如下: _scrollController = ScrollController(); //监听滚动位置 _scrollController.addListener

    1.9K20

    微信小程序生命周期学习笔记-页面篇

    function 否 生命周期回调—监听页面初次渲染完成 onHide function 否 生命周期回调—监听页面隐藏 onUnload function 否 生命周期回调—监听页面卸载 onLoad...onReady Ready,结束。它的作用是监听页面初次渲染完成。渲染,简单理解就是将页面的内容显示在屏幕上的过程。渲染结束即为Ready,这一点是比较好理解的。...onLoad、onShow的执行先后顺序我们已经研究过了,那么onReady如何呢?...如何卸载一个页面?最简单的方式:退出这个页面。简单理解,即为后续操作不是一定要返回这个页面的,那就要卸载,来省去一点被占用的内存。...再度被切回前台或回到该页面(总而言之,就是显示在屏幕上了)时,执行onShow函数。 7.退出该页面时,对数据进行消除(destroy),然后执行onUnload函数,结束整个页面过程。

    1.2K10

    女博士三胎后重返科研:我是这样平衡家庭和工作的

    为了家庭选择离开学术圈的女性如何重返学术界?瑞秋·詹姆斯(Rachel James)讲述了自己生育三胎和重返学界的亲身经历。...(本文原文刊登于Nature Career,原标题为“兼职研究员是如何吸引科学家回到学术界”。中文版由PaperRSS编译。) 决定要孩子意味着我必须灵活地处理家庭生活和科学事业之间的平衡。...16年后,我回到学术界,保持这种平衡教会了我很多关于我自己和我的工作态度。 2005年,在我第一个博士后职位即将结束时,我有了三个孩子中的第一个。...回到研究工作后,我有幸遇到了许多研究人员,他们的研究生涯中有不同长度的空白。虽然我们仍然只是研究团体中的一小部分,但我们的人数可能比你意识到的要多得多。...更具包容性和多元化是研究环境的一部分,所以如果你面临结束的合同或不可避免的生活挑战时可以放心,我们的研究工作可能分支,甚至暂停,但不是结局。

    54410

    阿里架构师手写Tomcat——Session源码解析

    在这篇文章中,我们将分析 tomcat 容器是如何创建 session、销毁 session,又是如何对 HttpSessionListener 进行事件通知 tomcat session 设计分析 -...sessionIdGenerator); public void add(Session session); public void addPropertyChangeListener(PropertyChangeListener...Session 检查 backgroundProcessorDelay 参数默认值为 -1,单位为秒,即默认不启用后台线程,而 tomcat 的 Container 容器需要开启线程处理一些后台任务,比如监听...ContainerBase 有个 threadDone 变量,用 volatile 修饰,如果调用 Container 容器的 stop 方法该值便会赋值为 false,那么该后台线程也会退出循环,从而结束生命周期...,下面我们重点来看看 webapp 这一层,以及 StandardManager 是如何清理过期会话的。

    51600

    阿里架构师手写Tomcat——Session源码解析

    在这篇文章中,我们将分析 tomcat 容器是如何创建 session、销毁 session,又是如何对 HttpSessionListener 进行事件通知 tomcat session 设计分析 -...sessionIdGenerator); public void add(Session session); public void addPropertyChangeListener(PropertyChangeListener...Session 检查 backgroundProcessorDelay 参数默认值为 -1,单位为秒,即默认不启用后台线程,而 tomcat 的 Container 容器需要开启线程处理一些后台任务,比如监听...ContainerBase 有个 threadDone 变量,用 volatile 修饰,如果调用 Container 容器的 stop 方法该值便会赋值为 false,那么该后台线程也会退出循环,从而结束生命周期...,下面我们重点来看看 webapp 这一层,以及 StandardManager 是如何清理过期会话的。

    68010

    想查看微信好友撤回的消息?Python帮你搞定

    3、如何发送消息给好友 如何发送一条消息给指定的好友呢?...例如现在有一个函数fun(),你并不知晓函数的实现原理,你肯定也不能去修改这个函数的代码,而你需要给该函数添加一个输出开始运行时间和结束运行时间的功能,该如何实现呢?这个时候就可以使用装饰器。...在这里插入图片描述 如何监听好友撤回了消息 到这里,我们其实已经完成了消息监听,只需要稍加修改即可,但是这个程序是有缺陷的,因为不是所有消息我们都需要去保存的,好友正常发送过来的消息我们直接就能看到,保存下来不是多此一举吗...我们的目的是想知道好友撤回了什么内容,这就涉及到如何监听好友是否撤回了消息这一问题了。其实也非常简单,Content模块为我们提供了NOTE类型,该类型指的是系统消息。...说说我遇到的一些坑 这个程序说它难,其实并不难,但我也在编写的过程中遇到了一些坑,一开始我是一条消息一条消息地进行测试,发现程序是正常的,但我连续撤回几条消息,却发现程序出现了Bug。

    2.9K31

    零基础入门 21: UGUI Inputfield

    第四步,就是回到unity里运行之后查看结果咯 我们先什么都不输入,日志结果,用户输入内容:后面应该是空的,什么都没有 ?...知道了如何获取玩家输入内容后,还需要掌握一件事,就是对文本输入框的事件监听。 InputField组件经过版本迭代,api修改之后,现在留有3个事件以供使用者操作。...执行顺序如下: onValidateInput:有字符插入 onValueChanged:文本框内容变化 onEndEdit:结束编辑 我们可以通过监听这几个事件来完成对需求的实现,比如说我们可以监听字符插入事件...回到Mono里,我们实现这几个事件。 第一个实现结束编辑的 ? 第二个实现输入框内容变化的事件 ? 第三个实现有字符插入事件 ?...上面的这几个事件应该都还比较好理解,第1个是编辑结束后,拿到的编辑结束的事件,我们输出了日志,可以拿到输入完成后的文本输入框内容。

    2.7K30

    理论 | Angular 中的响应式编程 -- 浅淡 Rx 的流式思维

    我们来看一下用响应式编程如何处理这个逻辑。...理解 Rx 的关键是要把任何变化想象成数据流,数据流分为几种: 1、永远不会结束的 2、有限次的,比如执行若干次结束的(包括只发生一次的) 3、当然还有一些特殊的,比如永远不会发生的(这个是为了解决某些特定场景问题存在的...) 这么说好像比较抽象,那么还是回到例子来看这个问题。...我们再回到一开始的小题目,我们的两个原始数据流:age$ 和 ageUnit$ 怎么构建?...但我们可能需要对这个原始数据流再做点处理。首先,我们并不希望每次改这个值都去监听,因为输入是一个连续事件,每一次按键都监听是不太划算的。

    5.2K10

    这款黑科技,不会代码也能玩自动化,高效摸鱼

    以每天定时去京*签到领京豆为例,来说说如何实现这一自动化操作。 首先,我们在【任务 Tab】界面,点击右下角的 + 号,并定义一个名称:京*签到,新建一个任务。 第 1 个操作是杀死京* App。...操作步骤是依次是:点击右下角的新增 - 程序 - 结束应用 - 选择京* App,利用返回键返回到任务编辑界面。 ? 任务的 2 个操作是启动京* App,操作步骤和上面一样。...具体操作步骤是:新建一个操作 - 插件 - 选择 TouchTask - Actions 事件监听 - 配置 - Actions选择 Tap - 标题栏的手,回到桌面。...第 9 步,回到桌面。 回到桌面的操作也很简单,直接利用 TouchTask 插件全局动作中的 Go home 即可以模拟按压 Home 键,回到系统桌面。 ?...操作步骤是:点击右下角的 + 号 - 选择时间 - 指定开始时间和结束时间。 比如:每天早上 7 点准时签到,我们只需要指定开始时间和结束时间相同即可。 ?

    2.6K10

    原生 JS 手写一个优雅的图片预览功能,带你吃透背后原理

    PC上的点击、移动,H5的手势操作,都离不开DOM事件监听。...例如鼠标移动事件对应 mousemove,移动端因为没有鼠标则对应 touchmove,而本文将介绍如何仅通过指针事件来进行多端统一的事件监听。...需要注意的是每次移动事件结束时都必须更新初始点位,否则膨胀的偏移距离会使图片加速逃逸可视区域。另外当抬起动作结束时,会触发 click 事件,所以注意加入全局变量标记以及定时器进行一些判断处理。...这就回到前面提到的,原点位置突然改变带来的偏移量引起了图片位置的闪动,这段偏移是如何产生的呢?...虽然浏览器滚动对应的其实是 scroll 事件,但我们在PC上滚动通常都是用利用滚轮(笔记本触控板也被视作滚轮),所以在滚轮事件中阻止系统默认事件也就阻止了滚动,但不是完全阻止,因为滚动条没隐藏的话还是可以拖动来滚动页面的

    2.9K81

    Android开发使用自定义view实现ListView下拉的视差特效功能

    如图:下拉图片会产生图片拉升的效果,放手后图片有弹回到原处: ? 那我们如何实现呢?...ParallaListView) findViewById(R.id.lv_paralla); mListView.addHeaderView(mHeader); 三、功能实现: 1.现在基本能看到效果了,但我们必须要拖动图片...true 得到数据上拉:deltaY=4 scrollX=0 scrollRangeY=0 maxOverScrollY=0 isTouchEvent=true 2.如果是下拉,我们把值赋给header,但我如何获得高度呢...记得有个方法叫做iv.getViewTreeObserver(),那我们就在这个方法的监听事件里得到高度 iv.getViewTreeObserver().addOnGlobalLayoutListener...public void onGlobalLayout() { //当布局填充完成后,此方法会被调用 mListView.setParallaImage(iv); //移除监听

    54140

    想查看微信好友撤回的消息?Python帮你搞定

    3、如何发送消息给好友 如何发送一条消息给指定的好友呢?...例如现在有一个函数fun(),你并不知晓函数的实现原理,你肯定也不能去修改这个函数的代码,而你需要给该函数添加一个输出开始运行时间和结束运行时间的功能,该如何实现呢?这个时候就可以使用装饰器。...我们回到刚才的代码: import itchat from itchat.content import * # 导入itchat下的content模块 itchat.auto_login(hotReload...我们的目的是想知道好友撤回了什么内容,这就涉及到如何监听好友是否撤回了消息这一问题了。其实也非常简单,Content模块为我们提供了NOTE类型,该类型指的是系统消息。...说说我遇到的一些坑 这个程序说它难,其实并不难,但我也在编写的过程中遇到了一些坑,一开始我是一条消息一条消息地进行测试,发现程序是正常的,但我连续撤回几条消息,却发现程序出现了Bug。

    1.1K20

    叮当:一个开源的智能音箱项目

    虽然国内也有类似的智能音箱产品,但我没有用过这些产品,不知道可定制性如何。比如,如果我需要开发个功能让它告诉我某种面包的配方是什么,这些产品就不一定能做到了。考虑再三,我决定自己动手写一个。...指令接收 智能音箱要解决的一个最重要的问题就是如何接收指令。这里头主要涉及两个问题: 被动唤醒(Passive Listening),即“什么时候开始听”。这个阶段只监听唤醒词。...因此可以再加一个超时保护,超过 12 秒就结束聆听。 语音处理 说说STT(语音识别)引擎和TTS(文本转文本)引擎的选择。...如果没有下一首歌,就回到列表中第一首歌 上一首 上一首歌,上首歌 切换到上一首歌。...我实际上参考的是 darknessomi 的版本 ,但我认为最大的功劳还是该给 Vellow 。 ↩ 如果您知道如何批量获取播放地址且保持原来的列表顺序,还请告诉我方法。 ↩

    3.3K20

    为容器时代设计的高级 eBPF 内核特性(FOSDEM, 2021)

    通用目的引擎、最小指令集架构 之前我们讨论 eBPF 时大都集中在网络(networking)和跟踪(tracing)领域, 最近可能将范围扩大到了安全(security)领域 —— 但我想说的是:eBPF...Service 是对服务的抽象,服务包含一个入口和多个后端实例,因此涉及到负载均衡 ,即如何将请求分发到不同后端。...SNAT 这种模式下,node1 对源 IP 地址(Source IP)的处理: 请求:做源地址转换(SNAT) 响应:对源地址做反向转换(rev-SNAT) 响应包需要先回到 node1,再回到客户端...DSR 这种模式下,node1 不需要做 SNAT: 响应包也无需回到 node1,而是直接从 node2 回到客户端。 详见 [2,10],译注。...5.2 Cilium 方式:BPF EDT 在 Cilium 中,我们基于 multi-queue 和 BPF,实现了一种称为Earlist Departhure Time(EDT,最早离开时间) 的无锁

    1.5K10

    「前端页面停留时长」统计上报方案

    结合我们的应用场景,第3种方案是比较合适的,接下来主要需要解决的问题是如何监听页面的打开和关闭事件,对于单页面应用,就是下面这两个问题。 1.如何监听全部的路由跳转事件?...我们用beforeEach做拦截,除了首次进入,后面每次beforeEach都是前一个页面的结束。同时在beforeEach中,我们可以记下即将进入的路由和被退出的路由名称,供上报使用。...2.是否能够监听全部的关闭事件? 首先,判断回退事件是否可以监听到,我们考虑这三个事件:pagehide、onunload、onbeforeunload。...问题二:统计数据的上报 时长统计完成后,就是对于数据的上报了,我们可以考虑两种上报方案: 1.每次页面结束就上报 2.把时长数据存本地,批量上报 对每次页面结束就上报,可能存在关闭窗口导致页面上报请求未发送的问题...,解决这个问题有一些解决方案,比如Beacon API,但我们这边暂时不会用到,就不展开讨论了。

    2.3K20

    【Web技术】850- 深入了解页面生命周期API

    而如果用户再次访问被丢弃的页面,浏览器会重新加载页面,回到活动状态。 值得注意的是,用户一般会在资源受限的设备中体验到丢弃状态。 除了以上两种状态外,API中还引入了其他四种状态,分别是:。...页面生命周期API状态和过渡 如何应对生命周期状态? 现在我们已经了解了页面生命周期API,让我们看看如何响应每个事件。 这里最重要的是确定当应用程序达到每个状态时,哪些需要保留,哪些需要停止。...HIDDEN状态 - 隐藏状态应该被视为用户在网页上的会话的结束。你可以在此时坚持未保存的应用状态,并停止任何用户不需要在后台运行的UI更新或任务。...好了,现在我们知道在每个状态下要做什么了,让我们看看如何在我们的应用程序中捕获每个状态。 如何在代码中捕获生命周期状态?...虽然它更多地与高级用例相关,但我们可以通过了解它的功能来开发高效的网络应用。因此,我们可以为终端用户提供更好的体验。

    1.3K20
    领券