ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java图形用户界面swing假死卡死问题和JTable动态刷新问题的解决方案

2020-06-30 19:38:27  阅读:498  来源: 互联网

标签:break 界面 假死 void processScheduling JTable 线程 刷新 图形用户界面


发现问题

JTable动态刷新直到最后一次才刷新出来
swing界面在刷新过程中被卡住无法点击

所在项目

进程调度模拟

问题代码

点击“开始”后执行

private void button2ActionPerformed(ActionEvent e) {
   // TODO add your code here
   //执行进程
    select = comboBox1.getSelectedIndex();
    renewThread.start();
    switch (select) {
        case 0: {
            processScheduling.FCFS();
            break;
        }
        case 1: {
            processScheduling.SPF();
            break;
        }
    }
}
 

刷新一次(取出数据放入JTable)

    public void renewJTable4() {
    	//取出正在动态变化中的数据
        List<PCB> list = processScheduling.getFCFSPcb();
        //更新表格  
        DefaultTableModel tableModel = ((DefaultTableModel) table4.getModel());
        tableModel.getDataVector().clear();
        for (PCB pcb : list) {
            tableModel.addRow(pcb.toArray());
            //System.out.println(pcb.toString());
        }
    }

创建线程刷新界面

    public class RenewThread extends Thread {
        @Override
        public void run() {
            try {
                while (true) {
                    sleep(ToolForSch.renewTime);
                    renewAll();//刷新所有表格
                    //System.out.println("刷新一次");
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

失败运行截图

刷新过程截图(界面卡死)
在这里插入图片描述
刷新完成截图(运行到最后才显示出结果)
在这里插入图片描述

分析问题

发现swing界面是单线程的,一次只能有一个组件响应,一旦监听事件需要执行很久,则会发生界面的卡死,刷新也就徒劳。于是发生了当执行完毕后界面才刷新成功的情况。

解决方案

我们可以将执行的方法放在一个线程中执行,与swing界面的线程并行,这样界面就不会被锁

更换代码

只需套上一个线程“外套”

    private void button2ActionPerformed(ActionEvent e) {
        // TODO add your code here
        //执行进程
        new Thread(()->{
            select = comboBox1.getSelectedIndex();
            //renewThread.start();
            switch (select) {
                case 0: {
                    processScheduling.FCFS();
                    break;
                }
                case 1: {
                    processScheduling.SPF();
                    break;
                }
            }
        }).start();
    }

成功运行截图

此时界面实现了动态刷新
成功截图

标签:break,界面,假死,void,processScheduling,JTable,线程,刷新,图形用户界面
来源: https://blog.csdn.net/GDUT_xin/article/details/106991423

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有