【问题标题】:Launch a background Thread by using a JButton使用 JButton 启动后台线程
【发布时间】:2018-05-18 14:38:42
【问题描述】:
我对 Java 没有信心,但我正在开发一个工具来监控我们公司的服务器硬盘,因为我们遇到了一些问题。
我一直在创建一个带有简单菜单的简单框架和带有一些信息的JPanel,但这并不重要。
我的想法很简单:按下JFrame 的JButton,然后我的服务(这是一个扩展Thread 的类,每个周期都会休眠一段时间)启动。
我做了所有的类,但是我有这个问题:当我按下按钮时,背景类开始了,但是我失去了对主框架的控制。
如何将框架类与背景类分开?
【问题讨论】:
-
如果您的代码除了让按钮启动之外还能正常工作,请考虑向按钮添加动作侦听器。见link
-
标签:
java
multithreading
swing
events
jbutton
【解决方案1】:
然后我的服务(这是一个类扩展线程并在每个周期休眠一段时间)启动。我做了所有的类,但我有这个问题:当我按下我的 JButton 时,后台类启动,但我失去了对主 JFrame 的控制。
不完全确定“主要 JFrame 的松散控制”是什么意思。但我猜它不再响应用户事件。
这可能是因为您的 Thread.sleep 导致 Event Dispatch Thread (EDT) 进入睡眠状态,所以您是:
- 没有正确创建线程,或者
- 睡错了线程。
在任何情况下,我都建议在 ActionListener 中向按钮添加启动SwingWorker。 SwingWorker 将为您创建线程,它允许您与框架正确通信。
阅读 Concurrency 上的 Swing 教程部分,了解更多信息和示例,以帮助您入门。本教程将详细解释EDT。
【解决方案2】:
您能提供更多信息吗?
但是据我所知,您应该向您的 JButton 添加一个事件侦听器。
示例代码:
BackGroundThread task = new BackGroundThread();
JButton btn = new JButton("Run task");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
task.start();
}
});