swing登陆程序的异步loading效果,避免程序假死状态?swing 后台操作事件长 , 界面如何显示正在等待?_swing 多线程loading_cnq2328的博客-程序员秘密



swing登陆程序的异步loading效果,避免程序假死状态?swing 后台操作事件长 , 界面如何显示正在等待?

在Java 桌面应用程序开发中,使用swing 进行后台操作时,如果后台执行反应时间长,那么界面就会出现假死状态,swing 给出了这样的解决方案:SwingWorker, 它就是解决后台操作时间过长,导致用户体验差这个事情的。对于一般不是超长时间处理,但又不想卡住界面的场景,SwingWorker是最合适的。如果是超长时间处理,则可以在SwingWorker任务执行后,起一个model的对话框,做一个进度条,SwingWorker也可以通过中间过程和进度条交互。

本文解决非超长时间处理的场景,你可以新建一个类SwingWorkerTest实现SwingWorker接口,并实现它的done()方法和doInBackground()方法。或者直接在单击按钮的监听事件中,直接new SwingWorker:
//参数解释: T:表示做完后台操作需要返回的对象,例如我下面的ReturnCode.V:一般用Void表示,形如下面我的例子。
//doInBackground()方法是你想在后台进行的操作,例如登陆验证操作,我们可以在doInBackground()方法中放置一个gif的动态loading状态图标签,当单击按钮的时候,它会执行doInBackground方法,执行完毕后,再执行done()方法。我们在done方法中做的操作就是参数的传递和关闭当前的Login窗体、显示主窗体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//原型
new SwingWorker<t , V>(){
 
             @Override
             protected T doInBackground() throws Exception {
                 // TODO Auto-generated method stub
                 return null ;
             }
             
         @Override
             protected void done() {
          // TODO Auto-generated method stub
          super .done();
         }
};
/**
  * 例子
  *
  **/
new SwingWorker<returncode , Void>() {
             
             ReturnCode rc = null ;          
             cwa2 cw = null ;        
             @Override
             protected ReturnCode doInBackground() throws Exception {
                 cw = userInfo.getCwServer();
                                 //放置gif动态图片的JLabel
                 loading.setVisible( true );
                                 //登陆验证操作
                 rc = cw.authenticate(userInfo.getUserName(), userInfo.getPassword());
                 return rc;
             }
             
             @Override
             protected void done() {
                 if (rc == cwaapi.SUCCESS) {
                     MainFrm mf = new MainFrm();
                     mf.setUserInfo(userInfo);
                     mf.setLoginName();
                     mf.setVisible( true );
                     frame.dispose();
                 } else {
                     lblWaiting.setText(rc.getMessage());
                     loading.setVisible( false );
                 }
             }
         }.execute();

 
程序执行截图

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cnq2328/article/details/50323787

智能推荐

mac安装老版本xcode_max xcode如何安装其他版本_有石为玉的博客-程序员秘密

1.首先打开连接https://developer.apple.com/download/more/进入页面2.在搜索框中输入 xcode 回车搜索,如下图所示。下载需要版本即可。

监控服务器磁盘阵列哪个稳定,监控选择存储服务器和磁盘阵列_猫咪逗你玩儿的博客-程序员秘密

监控选择存储服务器和磁盘阵列 内容精选换一换当服务器中的磁盘发生故障、或者由于人为误操作导致服务器数据丢失时,可以使用已经创建成功的备份恢复原服务器。如果希望将数据恢复至其他服务器上,请参考如何将原服务器数据恢复至新创建的服务器?备份的数据盘的数据,不能恢复到系统盘中。不支持恢复到状态处于“故障”的服务器。不支持使用复制操作产生的备份用于恢复。需要恢复的服务器中的磁盘运行状态正常。配置目的端或启动...

cocos2d-x /cocos2d-iphone在mac下环境搭建_Colin丶的博客-程序员秘密

换了macbook ,迫不及待的装了xcode。下面谈谈在mac下cocos2d-x环境的搭建。(cocos2d-iphone)同样道理。首先,下载必须的文件。cocos2d 下载地址  http://www.cocos2d-iphone.org/downloadcoco2d -x 下载地址 http://code.google.com/p/cocos2d-x/down

UVA - 10480 Sabotage 最小割,输出割法_dengpangbu3703的博客-程序员秘密

UVA - 10480 Sabotage题意:现在有n个城市,m条路,现在要把整个图分成2部分,编号1,2的城市分成在一部分中,拆开每条路都需要花费,现在问达成目标的花费最少要隔开那几条路。题解:建图直接按给你的图建一下,然后呢跑一下最大流,我们就知道了最小割是多少,答案就是最小割了 。现在要求输出割法。我们从s开始往前跑,如果某条正向边有流量,我们就按着这条边继续往外走,...

【API设计风格—RESTful】:番外篇:跨域问题(四)_ionic serve ip_xu_chenyang的博客-程序员秘密

问题描述: Ionic serve 在浏览器中调试时IP是:http://localhost:8100 而我的本机的服务端的IP是:http://localhost:8080 所以存在跨域访问的问题。解决方法【1】设置response(此处只是了解,最终解决方案在下面) response.setHeader(“Access-Con

Xtool X100 PAD2 Error Code 5 Data Not Exist Solution_abc1294211669的博客-程序员秘密

If your XTOOL X100 Pad2 gives your error ” GetUpdateListEx: Error code= 5. Data doesn’t exist.”, which means your 2-year free update online service is due.Need to pay for new updates subscription expires after 2 years.https://xtooltools.blogspot.com/202

随便推点

算法题:找到1到n(乱序)中缺失的两个数_catEyesL的博客-程序员秘密

要求用O(n)的时间复杂度进行查找:1. 申请额外空间n个空间,记录当前数字是否出现过def find1(a, n): res = [] b = [0 for x in range(n)] for i in a: b[i-1] = 1 for i in range(n): if b[i] == 0: res.append(i+1) return res2.利用数学公式,先求1到n的平方和和1到.

QT从数据库中读带空格的字符串并按空格切分字符串并以折线图的形式显示在QCharts上_qt文件操作 提取一行内容 中间空格分开_小王庄的博客-程序员秘密

QString filtRes; //从数据库中读取的字符串 QSqlQuery queryFilt; //数据库查询结果 //sql语句 从filtresult表中查询detect_id为dataGet的filt_res QString filtSql("SELECT filt_res FROM filtresult WHERE detect_id = '" + dataGet + "'"); queryFilt.exec(filtSql); if (queryFilt.next().

铅酸蓄电池三阶simulink仿真模型,可获得蓄电池充放电特性,并提供数学模型相关文献和多组电池模型参数。_铅酸电池三阶模型_「已注销」的博客-程序员秘密

铅酸蓄电池三阶simulink仿真模型,可获得蓄电池充放电特性,并提供数学模型相关文献和多组电池模型参数。ID:6950652335028570t***5

无人机室内编队系统集成(一)_无人机编队室内飞行系统_北里小生的博客-程序员秘密

无人机室内编队系统集成简介系统集成关键组件室内定位系统支持外部位置数据导入的开源飞控组网通信地面站基础功能系统集成关键组件1 支持引入外部定位数据(室内定位系统提供)的飞行控制器2 提供精确室内定位数据的室内定位系统3 具备定位数据转发和飞行器实时监控及实时轨迹控制的地面站4 点到多点的组网通信系统室内定位系统目前精度可以满足无人机室内飞行的较为成熟的室内定位方案有:1 基于视觉的...

HDFS——HDFS的安全模式(4)_上善若水的博客-程序员秘密

什么时候安全模式?安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。如果HDFS处于安全模式,则表示HDFS是只读状态。 当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。假设我们设置的副本数(即参数dfs.replication)是5,那么在datanode上就应该有5个副本存在,假设只存在3个副本,那么比例就是3/5=0.6。在配置文件hdf...

长草问题_长草 c++_haobingqian_的博客-程序员秘密

问题描述  小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。  小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。  这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。  请告诉小明,k 个月后空地上哪些地方有草。1 2 3 4输入格式  输入的第一行包含两个整数 n, m。  接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字