java – 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<Void,Progress> loadingWorker = new SwingWorker<Void,Progress>() { @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<Progress> 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<Void,Void> secondWorker = new SwingWorker<Void,Void>() { @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来监视进度和状态属性的更改并采取适当的操作…… 简单设置进度更新的工人…… public class LoadMaster extends SwingWorker<Void,Progress> { @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)); 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<Void,Progress> { @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<String,Void> { 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(); } } } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 将REST Assured测试中的请求和响应详细信
- java – SetVisible(false)更改我的Panel中组件的
- multicore – Volatile vars和多核线程同步!
- 添加另一个对象时java.util.ConcurrentModificat
- 详解java中反射机制(含数组参数)
- Java Map 键值对排序 按key排序和按Value排序
- java – org.apache.batik.dom.svg.SVGDOMImplem
- Java中的多线程JPEG图像处理
- 如何将JDK6 ToolProvider和JavaCompiler与上下文
- Android获取当前手机设备信息工具类