使用JButton启动后台线程

时间:2018-05-18 14:38:42

标签: java multithreading swing events jbutton

我对Java没有信心,但我正在开发一种监控公司服务器HDisks的工具,因为我们遇到了一些问题。

我一直在创建一个简单的框架,其中包含一个简单的菜单,JPanel包含一些信息,但这并不重要。

我的想法很简单:按JButton的{​​{1}},然后我的服务(这是一个类扩展JFrame并在每个周期睡眠一段时间)开始。 我做了所有课程,但是我遇到了这个问题:当我按下按钮时,后台课程开始了,但我失去了对主框架的控制。

如何在背景类之间分隔框架类?

2 个答案:

答案 0 :(得分:0)

  

然后我的服务(这是一个类扩展线程并在每个周期休眠一段时间)开始。我创建了所有类,但是我遇到了这个问题:当我按下我的JButton时,后台类启动了,但是我放松了对主JFrame的控制。

不完全确定"松散控制主JFrame"手段。但我猜测它不再响应用户事件。

这是因为你的Thread.sleep导致Event Dispatch Thread (EDT)睡觉,所以你要么:

  1. 没有正确创建线程,或
  2. 睡错了线程。
  3. 在任何情况下,我都会建议您在ActionListener中添加一个SwingWorker按钮。 SwingWorker将为您创建线程,它允许您与框架正确通信。

    阅读Concurrency上Swing教程中的部分,了解更多信息和示例,以帮助您入门。本教程将详细介绍EDT

答案 1 :(得分:0)

您能提供更多信息吗? 但是根据我的理解,你应该为你的JButton添加一个事件监听器。 示例代码:

    BackGroundThread task = new BackGroundThread();
    JButton btn = new JButton("Run task");
    btn.addActionListener(new ActionListener() {            
           public void actionPerformed(ActionEvent arg0) {
            task.start();
        }
    });