fubarable

SwingWorker example

Jul 8th, 2021
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.14 KB | None | 0 0
  1. import java.awt.BorderLayout;
  2. import java.awt.event.KeyEvent;
  3. import java.beans.PropertyChangeEvent;
  4. import java.beans.PropertyChangeListener;
  5. import java.beans.PropertyChangeSupport;
  6. import java.util.List;
  7. import java.util.concurrent.ExecutionException;
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. import javax.swing.*;
  11.  
  12. @SuppressWarnings("serial")
  13. public class Example2 extends JPanel {
  14.     private JTextArea textArea = new JTextArea(20, 50);
  15.     private Task2 task2 = null;
  16.     private JButton doItBtn = new JButton("Do it!");
  17.    
  18.     public Example2() {
  19.         textArea.setFocusable(false);
  20.         JScrollPane scrollPane = new JScrollPane(textArea);
  21.         scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  22.        
  23.         doItBtn.setMnemonic(KeyEvent.VK_D);
  24.         doItBtn.addActionListener(e -> startTask());
  25.         JPanel btnPanel = new JPanel();
  26.         btnPanel.add(doItBtn);
  27.        
  28.         setLayout(new BorderLayout());
  29.         add(scrollPane);
  30.         add(btnPanel, BorderLayout.PAGE_END);
  31.     }
  32.    
  33.     private void startTask() {
  34.         doItBtn.setEnabled(false); // disable button
  35.         task2 = new Task2();
  36.         final MyWorker worker = new MyWorker(task2);
  37.         worker.addPropertyChangeListener(pcsEvent -> {
  38.             if (pcsEvent.getNewValue() == SwingWorker.StateValue.DONE) {
  39.                 doItBtn.setEnabled(true);
  40.                
  41.                 try {
  42.                     @SuppressWarnings("unused")
  43.                     int result = worker.get();
  44.                 } catch (InterruptedException | ExecutionException e) {
  45.                     e.printStackTrace();
  46.                     // TODO: show a JOptionPane error message if problem here
  47.                 }
  48.             }
  49.         });
  50.         worker.execute();
  51.     }
  52.    
  53.     class MyWorker extends SwingWorker<Integer, String> {
  54.  
  55.         private Task2 task2;
  56.  
  57.         public MyWorker(Task2 task2) {
  58.             this.task2 = task2;
  59.         }
  60.  
  61.         @Override
  62.         protected Integer doInBackground() throws Exception {
  63.             task2.addPropertyChangeListener(pcsEvent -> stateEvent(pcsEvent));
  64.             int result = task2.doTask();
  65.             return result;
  66.         }
  67.        
  68.         private void stateEvent(PropertyChangeEvent event) {
  69.             if (Task2.STATE.equals(event.getPropertyName())) {
  70.                 publish((String) event.getNewValue());
  71.             }
  72.         }
  73.        
  74.         @Override
  75.         protected void process(List<String> chunks) {
  76.             for (String chunk : chunks) {
  77.                 textArea.append(chunk + "\n");
  78.             }
  79.         }
  80.        
  81.     }
  82.    
  83.     public static void main(String[] args) {
  84.         SwingUtilities.invokeLater(() -> {
  85.             Example2 example = new Example2();
  86.            
  87.             JFrame frame = new JFrame("GUI");
  88.             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  89.             frame.add(example);
  90.             frame.pack();
  91.             frame.setLocationRelativeTo(null);
  92.             frame.setVisible(true);
  93.         });
  94.     }
  95.    
  96. }
  97.  
  98.  
  99. class Task2 {
  100.     public static final String STATE = "state";
  101.     private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
  102.     private String state;
  103.    
  104.     public String getState() {
  105.         return state;
  106.     }
  107.    
  108.     public void setState(String state) {
  109.         String oldValue = this.state;
  110.         String newValue = state;
  111.         this.state = state;
  112.        
  113.         pcs.firePropertyChange(STATE, oldValue, newValue);
  114.     }
  115.    
  116.     public void addPropertyChangeListener(PropertyChangeListener listener) {
  117.         pcs.addPropertyChangeListener(listener);
  118.     }
  119.    
  120.     public void removePropertyChangeListener(PropertyChangeListener listener) {
  121.         pcs.removePropertyChangeListener(listener);
  122.     }
  123.    
  124.     public int doTask() throws InterruptedException {
  125.         //this method carrys out a background task an updates progress string throughout
  126.         setState("Starting");
  127.         System.out.println(getState());
  128.         TimeUnit.SECONDS.sleep(2L);
  129.         setState("hitting the flux capacitor");
  130.         System.out.println(getState());
  131.         TimeUnit.SECONDS.sleep(2L);
  132.         setState("servicing Mr. Fusion");
  133.         System.out.println(getState());
  134.         TimeUnit.SECONDS.sleep(2L);
  135.         setState("tuning Time circuits");
  136.         System.out.println(getState());
  137.         TimeUnit.SECONDS.sleep(2L);
  138.         setState("cleaning Plutonium chamber");
  139.         System.out.println(getState());
  140.         TimeUnit.SECONDS.sleep(2L);
  141.         setState("configuring Roentgen meter");
  142.         System.out.println(getState());
  143.         TimeUnit.SECONDS.sleep(2L);
  144.         setState("finished");
  145.         System.out.println(getState());
  146.        
  147.         return 0;
  148.     }
  149.    
  150. }
Add Comment
Please, Sign In to add comment