标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。