【问题标题】:Launch a background Thread by using a JButton使用 JButton 启动后台线程
【发布时间】:2018-05-18 14:38:42
【问题描述】:

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

我一直在创建一个带有简单菜单的简单框架和带有一些信息的JPanel,但这并不重要。

我的想法很简单:按下JFrameJButton,然后我的服务(这是一个扩展Thread 的类,每个周期都会休眠一段时间)启动。 我做了所有的类,但是我有这个问题:当我按下按钮时,背景类开始了,但是我失去了对主框架的控制。

如何将框架类与背景类分开?

【问题讨论】:

  • 如果您的代码除了让按钮启动之外还能正常工作,请考虑向按钮添加动作侦听器。见link
  • 谢谢你们,我已经解决了这个问题。至少,它是

标签: java multithreading swing events jbutton


【解决方案1】:

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

不完全确定“主要 JFrame 的松散控制”是什么意思。但我猜它不再响应用户事件。

这可能是因为您的 Thread.sleep 导致 Event Dispatch Thread (EDT) 进入睡眠状态,所以您是:

  1. 没有正确创建线程,或者
  2. 睡错了线程。

在任何情况下,我都建议在 ActionListener 中向按钮添加启动SwingWorkerSwingWorker 将为您创建线程,它允许您与框架正确通信。

阅读 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();
            }
        });        
    

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 2017-04-18
      • 2023-01-30
      • 2021-09-10
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多