我有个问题。
我有一个jframe
。它将创建JDialog
。
按下JDialog/code>上的按钮时,应将其处理并发送电子邮件。同时,我需要另一个
JDialog
与未确定的JProgressBar
一起出现。当发送电子邮件时,jdialog
应该被释放(并创建新的),或者它的内容应该改变。
我已经失败了好几个小时了,所以我想问enyone他(或她)是否愿意给我写一个伪代码来做我想做的事情。
看看
SwingWorker
类中应该包含哪些内容(或者使用多线程,如果您认为它更好的话),什么时候应该创建/释放JDialog
,以及在电子邮件发送中的位置...
我知道我要求的是一个完整的解决方案,但我已经失败了很多次了。这是我最后的选择...
我为你做了一个简短的例子,希望对你有帮助。基本上显示了带有按钮的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有一个很好的例子 看一下发布和处理 潜在的意图是,您仅需要从事件调度线程中更