Java图形用户界面swing假死卡死问题和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();
            }
        }
    }

失败运行截图

刷新过程截图(界面卡死)
Java图形用户界面swing假死卡死问题和JTable动态刷新问题的解决方案
刷新完成截图(运行到最后才显示出结果)
Java图形用户界面swing假死卡死问题和JTable动态刷新问题的解决方案

分析问题

发现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();
    }

成功运行截图

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

上一篇:java swing包中 与table相关的类、接口和方法


下一篇:Python字符集