我正在编写一个java swt应用程序来处理服务器日志文件并使用一些分析生成excel表,我没有遇到任何问题。
当我尝试更新进度条时出现问题。
这是代码的基本流程。用户使用directoryDialog选择日志文件并按下开始按钮。单击该按钮时,将执行以下代码。
startButton.addMouseListener(new MouseAdapter() {
public void mouseUp(MouseEvent e) {
pm.setUserData(ud,progressBar);
progressBar.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
pm.startProcessing();
}
});
}
在实际处理文件的类中,有一个简单的while循环,它循环直到到达文件的末尾。从文件中读取每一行后,我调用一个更新进度条的方法。
while ((logEntry = br.readLine()) != null) {
readSize += logEntry.length() + 1;
//some long processing logic
progressBar.setSelection(getProgress());
}
getProgress()是一个计算文件读取百分位数的简单方法
(read/total)*100
以上计划正在运作。我得到了预期的结果。进度条更新但gui变得反应迟钝。我无法移动窗户。我无法点击关闭按钮。
我尝试使用swing worker和display.asyncExec()
答案 0 :(得分:2)
SWT文档明确指出ProgressBar.setSelection()
在未从UI线程调用时将抛出异常(ERROR_THREAD_INVALID_ACCESS
)。这意味着您要么在代码中的某处吞下异常,要么在UI线程中运行上面的代码。
有一个snippet which shows how to update a ProgressBar
from a thread:
display.asyncExec(new Runnable() {
@Override
public void run() {
if (bar.isDisposed ())
return;
bar.setSelection(getProgress);
}
});