Java swing doIn后台停止程序

问题描述 投票:0回答:1

我是 Java Swing 的新手,我需要制作一些简单的 Java 桌面应用程序。 我有 MainPanel,其中我有 SwingWorker 和 doInBackgroung,我在其中调用服务,该服务调用 DAO 从数据库中查询数据。我还有一个停止按钮,点击它设置 worker.cancel(true),但程序没有停止,我什至不能用 X 按钮关闭窗口。 我想处理并没有立即停止,因为对数据库的查询还没有结束,但为什么我不能关闭窗口?

这是代码:

worker = new SwingWorker() {

            @Override
            protected Object doInBackground() throws Exception {

                long startTime = System.nanoTime();
                textArea.append("Starting...\n");

                generatingFilesService.genereteFiles(connectionDBFirst, connectionDBSecond, connectionDBThird,
                        date1, date2);
    
                long endTime = System.nanoTime();
                double time = (double) ((endTime - startTime) / 1_000_000_000);
                if (ConnectionDBFirst.flag != false) {
                    if (time < 60d) {
                        textArea.append("Genereting ended for " + time + " seconds\n");
                        textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
                    } else {
                        textArea.append("Genereting ended for " + (time / 60) + " minutes\n");
                        textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
                    }
                }
                return null;
            }       
            
            @Override
            protected void done() {
                if (isCancelled()) {
                    textArea.append("Stopping generating files...\n");
                    closeConnections();
                    logger.info(Messages.PROCCESS_INTERUPTED);
                } else 
                    closeConnections();
            }
        };worker.execute();

停止代码:

if (e.getSource() == stop) {

        worker.cancel(true);

        stop.setEnabled(false);}
java swing swingworker
1个回答
0
投票

您正在从 doInBackground 方法中进行 Swing 突变调用:

textArea.append(...);

这打破了线程规则和你的程序。

解决方案是不这样做,而是

publish
需要显示的数据,然后
process
通过SwingWorker的publish/process方法对发布的信息。

例如,(代码未测试):

worker = new SwingWorker<Void, String>() {

    @Override
    protected Object doInBackground() throws Exception {
        long startTime = System.nanoTime();
        
        // textArea.append("Starting...\n");
        publish("Starting...\n");
        
        generatingFilesService.genereteFiles(connectionDBFirst, connectionDBSecond, connectionDBThird, date1, date2);
        long endTime = System.nanoTime();
        double time = (double) ((endTime - startTime) / 1_000_000_000);
        if (ConnectionDBFirst.flag != false) {
            if (time < 60d) {
                // textArea.append("Genereting ended for " + time + " seconds\n");
                // textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
                publish("Genereting ended for " + time + " seconds\n");
            } else {
                // textArea.append("Genereting ended for " + (time / 60) + " minutes\n");
                // textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
                publish("Genereting ended for " + (time / 60) + " minutes\n");
            }
        }
        return null;
    }       

    @Override
    protected void process(List<String> chunks) {
        for (String chunk : chunks) {
            textArea.append(chunk);
            textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
        }
    }

// ....
}
worker.execute();
© www.soinside.com 2019 - 2024. All rights reserved.