发现问题
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();
}
成功运行截图
此时界面实现了动态刷新