Java中的SwingWorker

我有个问题。

我有一个JFrame。它将创建一个JDialog

当按下开按钮时JDialog,应将其丢弃并发送电子邮件。同时,我需要另一个JDialog以不确定的形式出现JProgressBar。发送电子邮件时,JDialog应将其丢弃(并重新创建一封信),或更改其内容。

我现在已经失败了几个小时,所以我问enyone,他(或她)是否足够友善地为我编写一个可以满足我要求的伪代码。

只是为了看看应该在SwingWorker类中包含什么(或者,如果您认为更好的话,可以使用多线程),JDialog应该在何时创建/处置(s)以及在哪里保留发送电子邮件...

我知道我要在这里寻求完整的解决方案,但是我处于底线,已经失败了很多次……这是我的最后选择……


慕容森
浏览 473回答 3
3回答

万千封印

我做了一个简短的例子,希望对您有所帮助。基本上显示一个JFramewitha按钮:JButton单击框架上的时,JDialog将出现一个JButton(另一个)(发送电子邮件)-这表示电子邮件对话框:当JButton上emailDialog按下其配置的emailDialog,并创建一个新的JDialog将举行的进度(或在这种情况下,一个简单的JLabel):然后它创建并执行SwingWorker发送电子邮件和dispose()的JDialog当其完成并显示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 {&nbsp; &nbsp; public static void main(String[] args) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; SwingUtilities.invokeLater(new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new Test().createAndShowUI();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }&nbsp; &nbsp; private void createAndShowUI() {&nbsp; &nbsp; &nbsp; &nbsp; JFrame frame = new JFrame();&nbsp; &nbsp; &nbsp; &nbsp; frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&nbsp; &nbsp; &nbsp; &nbsp; initComponents(frame);&nbsp; &nbsp; &nbsp; &nbsp; frame.setPreferredSize(new Dimension(300, 300));//testing purposes&nbsp; &nbsp; &nbsp; &nbsp; frame.pack();&nbsp; &nbsp; &nbsp; &nbsp; frame.setVisible(true);&nbsp; &nbsp; }&nbsp; &nbsp; private void initComponents(final JFrame frame) {&nbsp; &nbsp; &nbsp; &nbsp; final JDialog emailDialog = new JDialog(frame);&nbsp; &nbsp; &nbsp; &nbsp; emailDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);&nbsp; &nbsp; &nbsp; &nbsp; emailDialog.setLayout(new BorderLayout());&nbsp; &nbsp; &nbsp; &nbsp; JButton sendMailBtn = new JButton("Send Email");&nbsp; &nbsp; &nbsp; &nbsp; sendMailBtn.addActionListener(new ActionListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void actionPerformed(ActionEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //get content needed for email from old dialog&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //get rid of old dialog&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailDialog.dispose();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //create new dialog&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final JDialog emailProgressDialog = new JDialog(frame);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailProgressDialog.add(new JLabel("Mail in progress"));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailProgressDialog.pack();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailProgressDialog.setVisible(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new Worker(emailProgressDialog).execute();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; emailDialog.add(sendMailBtn, BorderLayout.SOUTH);&nbsp; &nbsp; &nbsp; &nbsp; emailDialog.pack();&nbsp; &nbsp; &nbsp; &nbsp; JButton openDialog = new JButton("Open emailDialog");&nbsp; &nbsp; &nbsp; &nbsp; openDialog.addActionListener(new ActionListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void actionPerformed(ActionEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailDialog.setVisible(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; frame.getContentPane().add(openDialog);&nbsp; &nbsp; }}class Worker extends SwingWorker<String, Object> {&nbsp; &nbsp; private final JDialog dialog;&nbsp; &nbsp; Worker(JDialog dialog) {&nbsp; &nbsp; &nbsp; &nbsp; this.dialog = dialog;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected String doInBackground() throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(2000);//simulate email sending&nbsp; &nbsp; &nbsp; &nbsp; return "DONE";&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void done() {&nbsp; &nbsp; &nbsp; &nbsp; super.done();&nbsp; &nbsp; &nbsp; &nbsp; dialog.dispose();&nbsp; &nbsp; &nbsp; &nbsp; JOptionPane.showMessageDialog(dialog.getOwner(), "Message sent", "Success", JOptionPane.INFORMATION_MESSAGE);&nbsp; &nbsp; }}分享编辑

蓝山帝景

L&F物质的输出(因为您对EDT的不确定性有待测试)run:JButton openDialog >>> Is there EDT ??? == trueWorker started >>> Is there EDT ??? == falsewaiting 30seconds&nbsp;Worker endeded >>> Is there EDT ??? == falsebefore JOptionPane >>> Is there EDT ??? == falseorg.pushingpixels.substance.api.UiThreadingViolationException:&nbsp;&nbsp; &nbsp; &nbsp;Component creation must be done on Event Dispatch Thread和另外200行有关详细信息输出是 "correct container created out of EDT"我将在另一家L&F上进行测试,Nimbus可能存在问题,SystemLokkAndFeel在大多数情况下并不关心EDT上的重大错误(对EDT的敏感性完全不同),默认情况下,Metal在Windows平台上没有任何问题,对于Java6,那么您的示例也可以在第二基础上使用从代码import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import javax.swing.plaf.FontUIResource;public class Test {&nbsp; &nbsp; public static void main(String[] args) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ("Nimbus".equals(info.getName())) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIManager.setLookAndFeel(info.getClassName());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIManager.getLookAndFeelDefaults().put("nimbusOrange", (new Color(127, 255, 191)));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; } catch (ClassNotFoundException ex) {&nbsp; &nbsp; &nbsp; &nbsp; } catch (InstantiationException ex) {&nbsp; &nbsp; &nbsp; &nbsp; } catch (IllegalAccessException ex) {&nbsp; &nbsp; &nbsp; &nbsp; } catch (javax.swing.UnsupportedLookAndFeelException ex) {&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; SwingUtilities.invokeLater(new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIManager.setLookAndFeel(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "org.pushingpixels.substance.api.skin.SubstanceOfficeBlue2007LookAndFeel");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIManager.getDefaults().put("Button.font", new FontUIResource(new Font("SansSerif", Font.BOLD, 24)));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIManager.put("ComboBox.foreground", Color.green);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }*/&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new Test().createAndShowUI();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }&nbsp; &nbsp; private void createAndShowUI() {&nbsp; &nbsp; &nbsp; &nbsp; JFrame frame = new JFrame();&nbsp; &nbsp; &nbsp; &nbsp; frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&nbsp; &nbsp; &nbsp; &nbsp; initComponents(frame);&nbsp; &nbsp; &nbsp; &nbsp; frame.setPreferredSize(new Dimension(300, 300));//testing purposes&nbsp; &nbsp; &nbsp; &nbsp; frame.pack();&nbsp; &nbsp; &nbsp; &nbsp; frame.setVisible(true);&nbsp; &nbsp; }&nbsp; &nbsp; private void initComponents(final JFrame frame) {&nbsp; &nbsp; &nbsp; &nbsp; final JDialog emailDialog = new JDialog(frame);&nbsp; &nbsp; &nbsp; &nbsp; emailDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);&nbsp; &nbsp; &nbsp; &nbsp; emailDialog.setLayout(new BorderLayout());&nbsp; &nbsp; &nbsp; &nbsp; JButton sendMailBtn = new JButton("Send Email");&nbsp; &nbsp; &nbsp; &nbsp; sendMailBtn.addActionListener(new ActionListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void actionPerformed(ActionEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //get content needed for email from old dialog&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //get rid of old dialog&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailDialog.dispose();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //create new dialog&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final JDialog emailProgressDialog = new JDialog(frame);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailProgressDialog.add(new JLabel("Mail in progress"));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailProgressDialog.pack();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailProgressDialog.setVisible(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new Worker(emailProgressDialog, frame).execute();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; emailDialog.add(sendMailBtn, BorderLayout.SOUTH);&nbsp; &nbsp; &nbsp; &nbsp; emailDialog.pack();&nbsp; &nbsp; &nbsp; &nbsp; JButton openDialog = new JButton("Open emailDialog");&nbsp; &nbsp; &nbsp; &nbsp; openDialog.addActionListener(new ActionListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void actionPerformed(ActionEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("JButton openDialog >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emailDialog.setVisible(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; frame.getContentPane().add(openDialog);&nbsp; &nbsp; }}class Worker extends SwingWorker<String, Object> {&nbsp; &nbsp; private final JDialog dialog;&nbsp; &nbsp; private final JFrame frame;&nbsp; &nbsp; Worker(JDialog dialog, JFrame frame) {&nbsp; &nbsp; &nbsp; &nbsp; this.dialog = dialog;&nbsp; &nbsp; &nbsp; &nbsp; this.frame = frame;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected String doInBackground() throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Worker started >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread());&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("waiting 30seconds ");&nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(30000);//simulate email sending&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Worker endeded >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread());&nbsp; &nbsp; &nbsp; &nbsp; dialog.dispose();&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("before JOptionPane >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread());&nbsp; &nbsp; &nbsp; &nbsp; JOptionPane.showMessageDialog(frame, "Message sent", "Success", JOptionPane.INFORMATION_MESSAGE);&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("before JOptionPane >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread());&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; }}分享编辑

料青山看我应如是

只需done()在SwingWorker中重写该方法,然后将调用移至JOptionPane.showMessageDialog(frame, "Message sent", "Success", JOptionPane.INFORMATION_MESSAGE);该方法中。该方法done()一旦doInBackground()完成将被调用,并在EDT上运行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java