Swing线程实践:invokeLater实现实时进度与输入框更新
需积分: 18 77 浏览量
更新于2024-09-11
收藏 25KB DOCX 举报
Swing 线程之`SwingUtilities.invokeLater`是在Java Swing编程中处理并发问题的重要工具。当在Swing组件上进行耗时操作时,通常不建议在主线程中直接执行,因为这可能导致UI线程被阻塞,导致界面失去响应。`SwingUtilities.invokeLater`方法允许我们在后台线程中执行这些任务,同时保持UI线程的同步,确保界面的正常更新。
在本例中,`SwingThreadTest1`类展示了如何使用`SwingUtilities.invokeLater`来实现一个简单的界面,包含一个进度条、一个输入框和两个按钮(开始和结束)。功能需求是:点击开始按钮时,进度条更新并实时显示完成百分比,模拟一个正在运行的耗时任务。关键代码如下:
1. 定义组件:
- `JProgressBar` (`progressBar`)用于显示进度。
- `JTextField` (`text`)用于显示完成百分比,设置为只读。
- `JButton` (`start` 和 `end`)分别对应开始和结束操作。
2. 创建事件监听器:
- `start.addActionListener(newStart())`: 当用户点击开始按钮时,调用`newStart()`方法,这里实际应该创建一个实现了`ActionListener`接口的匿名内部类,以便处理按钮点击事件。
3. 实现`go()`方法:
- 使用一个while循环,`count`变量表示进度,初始值为0,上限为100。
- 在循环中,通过`Thread.sleep(100)`模拟一个耗时操作。实际上,这部分应该替换为需要执行的业务逻辑。
- 当`count`小于100时,调用`SwingUtilities.invokeLater`将更新进度条和文本的操作放在后台线程中执行,代码如下:
```java
SwingUtilities.invokeLater(() -> {
// 更新进度条
progressBar.setValue(count);
// 更新文本
text.setText(STR + count + "%");
// 假设count++ 是实际进度更新操作,这里为了简洁,仅模拟计数
count++;
});
```
4. 异常处理:
- 在`Thread.sleep`抛出`InterruptedException`时,捕获并打印异常,但不阻止程序继续执行。
通过`SwingUtilities.invokeLater`,这个示例确保了UI线程始终保持响应,即使执行耗时操作也不会阻塞用户界面。这是在Swing中正确处理并发操作的基本原则,避免了常见的GUI线程阻塞问题。
228 浏览量
点击了解资源详情
点击了解资源详情
228 浏览量
2024-10-10 上传
103 浏览量
148 浏览量
2011-08-01 上传
2023-04-11 上传