【问题标题】:How do I run a terminate command on JFrame exit?如何在 JFrame 退出时运行终止命令?
【发布时间】:2014-01-14 10:49:51
【问题描述】:

我知道尝试编写终止线程的代码背后的基础知识,但我遇到了一些问题。

我在 JFrame GUI 中有一个 JButton,可以启动我正在尝试制作动画的模拟。在JButton的ActionPerformed代码中被调用

new AnswerWorker().execute();

AnswerWorker 类反过来扩展 SwingWorker,以便在 GUI 仍处于活动状态时可以绘制动画帧。

public class AnswerWorker extends SwingWorker<String, Integer> {
    protected String doInBackground() throws Exception
    {
        Threading threading = new Threading();
    return null;
    }
protected void done()
{
try {
    JOptionPane.showMessageDialog(InputGUI.this, AMEC.unsuccesfulpercentage + "% of iterations had trucks that had to sleep over");
    AMEC.unsuccesfulpercentage = 0;
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

}

}

为了创建一种停止模拟线程的方法,我创建了 Threading 类,它调用运行模拟的函数。

public class Threading extends Thread {

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
    try {
        AMEC.runsimulation();
    } catch (IOException ex) {
        Logger.getLogger(InputGUI.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InterruptedException ex) {
        Logger.getLogger(InputGUI.class.getName()).log(Level.SEVERE, null, ex);
    }
        }
    return;
    }
}

现在,在 runsimulation() 函数中,我初始化了一个 JFrame,如果通过单击其关闭按钮关闭 JFrame,我想终止运行模拟的线程。我该怎么做?

编辑:上述所有代码都在包含我所有 GUI 元素的文件 InputGUI.java 中调用。运行模拟函数在我的主项目文件 AMEC.java 中

【问题讨论】:

    标签: java multithreading swing


    【解决方案1】:

    您可以覆盖 JFrame 上的 dispose() 方法以包含停止线程的调用

    @Override
    dispose(){
       stopThread();
       super.dispose();
    }
    

    【讨论】:

    • 在 dispose() { 它告诉我“无效声明;需要返回类型”。有什么想法吗?
    • 我试过了,但它现在声称你不能覆盖 awt.Window 中的 dispose,因为它说“尝试分配较弱的访问权限是公开的”
    • public void dispose() ;D
    • 在构造函数之后你需要调用方法 JFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE)
    • 啊,谢谢!最后,它说“找不到符号:方法 stopThread”。如何引用正确的线程并终止它?
    【解决方案2】:

    如何在 JFrame 退出时运行终止命令?

    • WindowListener添加到JFrame,从windowClosing事件你必须调用JFrame.setVisible(false)然后调用SwingWorker

    • SwingWorker结束后终止当前JVM,在出现任何异常的情况下显示JOptionPane,或再次将JFrame显示回屏幕,需要更改DefaultCloseOperation, to HIDE_ON_CLOSE

    【讨论】:

    • 如何调用 SwingWorker?我是调用实例 InputGUI.AnswerWorker,还是直接引用 SwingWorker?终止或中断该线程的语法是什么?
    • @Martin 这是一个问答网站,您似乎需要一位导师。投票结束时“过于宽泛”。
    猜你喜欢
    • 2016-04-27
    • 2020-06-18
    • 2014-08-18
    • 1970-01-01
    • 2016-10-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多