无论程序做什么,JFrame都会强制EXIT_ON_CLOSE

时间:2020-07-16 12:07:53

标签: java swing jframe thread-sleep

我有一个带frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)的jframe。 在此JFrame上,我通过使用方法getBestFlipProfit()(位于底部)导入API数据等来继续进行计算。 结果每3或4分钟显示在“框架”上(导入需要很长时间)。

我的问题是,当程序位于getBestFlipProfit()

中时,我无法关闭框架

调用getBestFlipProfit()的JFrame方法:

private void containtRefresher(){
    int delay = 100; // in milliseconds
    ActionListener taskPerformer = evt -> {
        Executor.getBestFlipProfit();
        String res = "<html>";
        for (String key: Executor.best_flips.keySet()) {
            res += DataManager.get_item_name(key) + " profit = " + 
            Executor.best_flips.get(key).get("profit") + "<br>";
        }
        bestflips.setText(res + "</html>");
    };
    new Timer(delay, taskPerformer).start();
}

getBestFlipProfit()方法: 您可以在Thread.sleep(70);中看到try,我认为问题是由此引起的,但是我不是100%确信,但是我无法删除它,因为那样导入API数据时会出错{ {1}}(=太快地执行请求)

只需说一句:当然有一种优化代码的方法,但这不是帖子的目的

429 Too Many Requests

2 个答案:

答案 0 :(得分:1)

您可以使用预定的执行器服务。

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();

private void containtRefresher(){
    int delay = 100; // in milliseconds
    Runnable taskPerformer = () -> {
        Executor.getBestFlipProfit();
        String res = "<html>";
        for (String key: Executor.best_flips.keySet()) {
            res += DataManager.get_item_name(key) + " profit = " + 
            Executor.best_flips.get(key).get("profit") + "<br>";
        }
        String html = res + "</html>";
        EventQueue.invokeLater( ()-> bestflips.setText(html) );
    };
    ses.scheduleAtFixedRate​(taskPerformer, delay, delay, TimeUnit.MILLISECONDS);
}

这应该与您所做的类似,但不会阻止EDT。当您关闭JFrame时,应用程序应退出,同时终止ExecutorService。

答案 1 :(得分:0)

我修复了它,我只需要像这样更改getBestFlipProfit方法:

private void containtRefresher(){
    while(true) {
        Executor.getBestFlipProfit();
        String res = "<html>";
        for (String key: Executor.best_flips.keySet()) {
            res += DataManager.get_item_name(key) + " profit = " + Executor.best_flips.get(key).get("profit") + ", amount = " + Executor.best_flips.get(key).get("amount") + "<br>";
        }
        bestflips.setText(res + "</html>");
        this.panel.revalidate();
    }
}