当前位置: 首页 > 知识库问答 >
问题:

Java中的SwingWorker[关闭]

夏才
2023-03-14

我有个问题。

我有一个jframe。它将创建JDialog

按下JDialog/code>上的按钮时,应将其处理并发送电子邮件。同时,我需要另一个JDialog与未确定的JProgressBar一起出现。当发送电子邮件时,jdialog应该被释放(并创建新的),或者它的内容应该改变。

我已经失败了好几个小时了,所以我想问enyone他(或她)是否愿意给我写一个伪代码来做我想做的事情。

看看SwingWorker类中应该包含哪些内容(或者使用多线程,如果您认为它更好的话),什么时候应该创建/释放JDialog,以及在电子邮件发送中的位置...

我知道我要求的是一个完整的解决方案,但我已经失败了很多次了。这是我最后的选择...


共有1个答案

庄子平
2023-03-14

我为你做了一个简短的例子,希望对你有帮助。基本上显示了带有按钮的JFrame

单击帧上的JButton时,将出现一个JDialog/code>和另一个JButton(发送电子邮件)-这将表示电子邮件对话框:

按下EmailDialog上的JButton时,它将处理EmailDialog并创建一个新的JDialog以保存progressbar(本例中为简单的JLabel):

然后创建并执行SwingWorker以发送JDialog的电子邮件和Dispose(),并显示JoptionPane消息,显示发送成功:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Test {

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().createAndShowUI();
            }
        });
    }

    private void createAndShowUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents(frame);
        frame.setPreferredSize(new Dimension(300, 300));//testing purposes
        frame.pack();
        frame.setVisible(true);
    }

    private void initComponents(final JFrame frame) {

        final JDialog emailDialog = new JDialog(frame);
        emailDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        emailDialog.setLayout(new BorderLayout());

        JButton sendMailBtn = new JButton("Send Email");
        sendMailBtn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //get content needed for email from old dialog

                //get rid of old dialog
                emailDialog.dispose();

                //create new dialog
                final JDialog emailProgressDialog = new JDialog(frame);
                emailProgressDialog.add(new JLabel("Mail in progress"));
                emailProgressDialog.pack();
                emailProgressDialog.setVisible(true);

                new Worker(emailProgressDialog).execute();

            }
        });

        emailDialog.add(sendMailBtn, BorderLayout.SOUTH);
        emailDialog.pack();

        JButton openDialog = new JButton("Open emailDialog");
        openDialog.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                emailDialog.setVisible(true);
            }
        });

        frame.getContentPane().add(openDialog);

    }
}

class Worker extends SwingWorker<String, Object> {

    private final JDialog dialog;

    Worker(JDialog dialog) {
        this.dialog = dialog;
    }

    @Override
    protected String doInBackground() throws Exception {

        Thread.sleep(2000);//simulate email sending

        return "DONE";
    }

    @Override
    protected void done() {
        super.done();
        dialog.dispose();
        JOptionPane.showMessageDialog(dialog.getOwner(), "Message sent", "Success", JOptionPane.INFORMATION_MESSAGE);

    }
}

 类似资料:
  • 我现在正在使用SwingWorker,我遇到了一点问题,我意识到不可能从http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html.多次执行SwingWorker线程 我的问题是,是否可以创建同一SwingWorker线程的新实例?在这里的代码中,我将工作线程称为“worker” 是否可以创建此线程的多个实例,以便我

  • 问题内容: 我对SwingWorker和Java GUI有疑问。 我有几类,其处理的信息,我们可以给他们打电话,和。此处理可能需要很长时间。 这些都是的子类,但是本身并不是直接调用的(这些类使用继承自的方法。为了使EDT自由绘制进度条,在保持对象层次结构时最好的使用方法是什么?是否具有包装器类,并且有其调用?即使不扩展,它仍然可以按我期望的那样工作吗? 编辑:澄清我的问题,即使他们已经是子类,我如

  • 问题内容: 我是Java的新手,我看了一些有关SwingWorker的教程。但是,我不确定如何使用在上一个问题中给出的示例代码来实现它。 任何人都可以就我的代码片段解释如何使用SwingWorker和/或将我引向一个不错的教程吗?我已经看过了,但不确定自己是否了解。 问题答案: 通常,用于在中执行长时间运行的任务。 在事件调度线程(EDT)上运行长时间运行的任务可能会导致GUI锁定,因此要做的一件

  • 问题内容: 我在FileReader上应用SwingWorker时遇到问题,我的观点是我需要在SwingWorker上实现FileReader,以使UI显示文件中的文本,这是我的代码 但是,它不会在UI文本区域上附加任何内容 有人有解决方案吗?谢谢 问题答案: 对我来说效果很好:

  • 问题内容: 我正在尝试在我的应用程序中实现一个类。有没有办法设置时间长度,之后SwingWorker会“超时”?我当时在想,也许会抛出一个异常,我可以捕捉然后处理。我只是不确定如何实现它。 感谢你的帮助! 问题答案: 为什么不将您的任务嵌入到Runnable中,将其放入新的单线程ExecutorService中,然后在适当的超时时间内对生成的Future执行。这将为您提供超时功能,因为如果作业未及

  • 问题内容: 您好,我想知道从swingworkerthread向jtextarea添加文本的最佳方法是什么,我创建了另一个类,Threadsclass()。execute()调用了jbutton。并且线程与此代码并行运行 现在id要做的是将x的值添加到主gui上的文本区域,任何想法都值得赞赏。 问题答案: JavaDocs有一个很好的例子 看一下发布和处理 潜在的意图是,您仅需要从事件调度线程中更