SwingWorker在另一个SwingWorker的done方法中

首先,我需要通知您,我正在努力学习如何用Java编写代码。 它有点困难,但是,我相信我拥有它。 我过去曾就SwingWorkers等提交了一些问题。 其中每一个我都认为我拥有它,但后来发现我还在学习。 希望这一次,不是那个时代之一。

话虽如此,请告诉我您认为不符合标准的任何内容,或者可能导致将来出现问题。


现在提出问题!

我构建了一个JFrame,在它允许用户进入另一个页面,按下按钮或其他任何内容之前加载了一些东西。 加载数据后,它将解锁JFrame以允许用户与数据交互。

问题是,(这不是一个真正的问题,只是一个澄清)我需要执行另一个任务,而用户可以这样的方式与JFrame交互它不会打扰他们,但是,将更新基于的JFrame它找到的结果。 一个例子可能是版本检查。 根据版本是否过期,通知用户。


示例Sudo代码

protected void startJFrame() { JFrame myFrame = new JFrame();//Starts with disable/invisible components. Preventing the user from doing to much before allowed. SwingWorker loadingWorker = new SwingWorker() { @Override protected Void doInBackground() throws Exception { publish(new Progress(0,"Loading This")); // Set Percent loadingTasks.loadThis(); // Do Work!! publish(new Progress(25,"Loading That")); // Set Percent loadingTasks.loadThat(); // Do Work!! publish(new Progress(50,"Loading More")); // Set Percent loadingTasks.loadMore(); // Do Work!! publish(new Progress(75,"Loading Last")); // Set Percent loadingTasks.loadLast(); // Do Work!! publish(new Progress(100,"Loading Complete"));// Set Percent return null; } @Override protected void process(List ProgressList) { for (Progress p : ProgressList) { System.out.println(p.getInt() + "% " + p.getString()); //Show user percent and what its doing. } } @Override protected void done() { try { get(); loadingTasks.WrapUp();//Set Variables or other small stuff. myFrame.userAllowed();//Lets the user interact with the whole JFrame. SwingWorker secondWorker = new SwingWorker() { @Override protected Void doInBackground() throws Exception { versionCheck.makeItSo();// Do Work!! return null; } @Override protected void done() { try { get(); versionCheck.wrapUp();//Set Variables or other small stuff. myFrame.showLabel();//Show a label with specific info. } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } }; secondWorker.execute(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } }; loadingWorker.execute(); } 

涉及此代码的主题问题。

我担心创建许多对象而不是处理它们,只是为了传递多个变量。 特别是在第一个doInBackground方法中创建的Progress对象。

这样做是否可以? 它会自动自动处理Progress Objects吗? 如果没有,在我完成它们之后我将如何处理它们?

SwingWorker支持PropertyChange事件,也就是说,您可以在SwingWorker更改状态或更新其进度时监听…是的, SwingWorker甚至支持进度通知,例如

这意味着您可以设置PropertyChangeListener来监视progressstate属性的更改并采取适当的操作……

简单设置进度更新的工人……

 public class LoadMaster extends SwingWorker { @Override protected Void doInBackground() throws Exception { System.out.println("Working hard here, nothing to see..."); for (int index = 0; index < 100; index++) { Thread.sleep(10); setProgress(index); } return null; } @Override protected void done() { try { get(); } catch (Exception e) { } } } 

一个例子PropertyChangeListener ...

 public class LoadMasterPropertyChanegHandler implements PropertyChangeListener { private SwingWorkerExample example; public LoadMasterPropertyChanegHandler(SwingWorkerExample example) { this.example = example; } @Override public void propertyChange(PropertyChangeEvent evt) { System.out.println(evt.getPropertyName()); if ("progress".equalsIgnoreCase(evt.getPropertyName())) { int value = (int) evt.getNewValue(); example.showProgress(value); } else if ("state".equalsIgnoreCase(evt.getPropertyName())) { SwingWorker worker = (SwingWorker) evt.getSource(); if (worker.isDone()) { try { worker.get(); example.loadCompleted(); } catch (InterruptedException | ExecutionException exp) { example.loadFailed(); } } } } } 

现在,所有这一切都是将信息发送回SwingWorkerExample (它即将到来),这样就可以确定它应该做什么......

在此示例中, loadCompleted方法更新UI,然后启动第二个worker ...

 protected void loadCompleted() { //... LoadStuffWorker stuffWorker = new LoadStuffWorker(this); stuffWorker.execute(); } 

事实上,我可能会使用接口,所以我不会公开地暴露这个类,但那是另一天的话题......

完整的例子......

工人

 import java.awt.EventQueue; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingWorker; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.EmptyBorder; public class SwingWorkerExample { private JProgressBar pb; private JPanel content; public static void main(String[] args) { new SwingWorkerExample(); } public SwingWorkerExample() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } pb = new JProgressBar(); content = new JPanel(); content.setBorder(new EmptyBorder(10, 10, 10, 10)); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(content); frame.setLayout(new GridBagLayout()); frame.add(pb); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); LoadMaster master = new LoadMaster(); master.addPropertyChangeListener(new LoadMasterPropertyChanegHandler(SwingWorkerExample.this)); master.execute(); } }); } protected void showProgress(int value) { pb.setValue(value); } protected void loadCompleted() { content.removeAll(); content.setLayout(new GridLayout(0, 1)); content.add(new JLabel("All your base are belong to us")); content.revalidate(); LoadStuffWorker stuffWorker = new LoadStuffWorker(this); stuffWorker.execute(); } protected void loadFailed() { content.removeAll(); content.setLayout(new GridLayout(0, 1)); content.add(new JLabel("Fail")); content.revalidate(); } protected void setVersion(String value) { content.add(new JLabel("Version: " + value)); content.revalidate(); } protected void failed(String fail) { content.add(new JLabel(fail)); content.revalidate(); } public class LoadMaster extends SwingWorker { @Override protected Void doInBackground() throws Exception { System.out.println("Working hard here, nothing to see..."); for (int index = 0; index < 100; index++) { Thread.sleep(10); setProgress(index); } return null; } @Override protected void done() { try { get(); } catch (Exception e) { } } } public class LoadStuffWorker extends SwingWorker { private SwingWorkerExample example; public LoadStuffWorker(SwingWorkerExample example) { this.example = example; } @Override protected String doInBackground() throws Exception { System.out.println("Hanging about in the background"); Thread.sleep(3000); return "Hello from the dark side"; } @Override protected void done() { try { String value = get(); example.setVersion(value); } catch (InterruptedException | ExecutionException ex) { example.failed("Fail while doing version check"); } } } public class Progress { } public class LoadMasterPropertyChanegHandler implements PropertyChangeListener { private SwingWorkerExample example; public LoadMasterPropertyChanegHandler(SwingWorkerExample example) { this.example = example; } @Override public void propertyChange(PropertyChangeEvent evt) { System.out.println(evt.getPropertyName()); if ("progress".equalsIgnoreCase(evt.getPropertyName())) { int value = (int) evt.getNewValue(); example.showProgress(value); } else if ("state".equalsIgnoreCase(evt.getPropertyName())) { SwingWorker worker = (SwingWorker) evt.getSource(); if (worker.isDone()) { try { worker.get(); example.loadCompleted(); } catch (InterruptedException | ExecutionException exp) { example.loadFailed(); } } } } } }