Mega Code Archive

 
Categories / Java / Threads
 

Swing and Thread for length operation

import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class SwingLengthyOperation extends JPanel {   private JButton searchBn = new JButton("Search");   private JButton cancelBn = new JButton("Cancel Search");   private JLabel balanceL = new JLabel();   private volatile Thread lookupThread;   public SwingLengthyOperation() {     cancelBn.setEnabled(false);     JPanel innerButtonP = new JPanel();     innerButtonP.setLayout(new GridLayout(1, -1, 5, 5));     innerButtonP.add(searchBn);     innerButtonP.add(cancelBn);     JPanel buttonP = new JPanel();     buttonP.setLayout(new FlowLayout(FlowLayout.CENTER));     buttonP.add(innerButtonP);     JLabel balancePrefixL = new JLabel("Account Balance:");          JPanel balanceP = new JPanel();     balanceP.setLayout(new FlowLayout(FlowLayout.CENTER));     balanceP.add(balancePrefixL);     balanceP.add(balanceL);     JPanel northP = new JPanel();     northP.setLayout(new GridLayout(-1, 1, 5, 5));     northP.add(buttonP);     northP.add(balanceP);     setLayout(new BorderLayout());     add(northP, BorderLayout.NORTH);     searchBn.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent e) {         search();       }     });     cancelBn.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent e) {         cancelSearch();       }     });   }   private void search() {     ensureEventThread();     searchBn.setEnabled(false);     cancelBn.setEnabled(true);     balanceL.setText("SEARCHING ...");     lookupAsync();   }   private void lookupAsync() {     Runnable lookupRun = new Runnable() {       public void run() {         String bal = lookupBalance();         setBalanceSafely(bal);       }     };     lookupThread = new Thread(lookupRun, "lookupThread");     lookupThread.start();   }   private String lookupBalance() {     try {       Thread.sleep(5000);       return "1,234.56";     } catch (InterruptedException x) {       return "SEARCH CANCELLED";     }   }   private void setBalanceSafely(String newBal) {     final String newBalance = newBal;     Runnable r = new Runnable() {       public void run() {         try {           setBalance(newBalance);         } catch (Exception x) {           x.printStackTrace();         }       }     };     SwingUtilities.invokeLater(r);   }   private void setBalance(String newBalance) {     ensureEventThread();     balanceL.setText(newBalance);     cancelBn.setEnabled(false);     searchBn.setEnabled(true);   }   private void cancelSearch() {     ensureEventThread();     cancelBn.setEnabled(false);     if (lookupThread != null) {       lookupThread.interrupt();     }   }   private void ensureEventThread() {     if (SwingUtilities.isEventDispatchThread()) {       return;     }     throw new RuntimeException("only the event "         + "thread should invoke this method");   }   public static void main(String[] args) {     JFrame f = new JFrame();     f.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });     f.setContentPane(new SwingLengthyOperation());     f.setSize(400, 150);     f.setVisible(true);   } }