BalanceLookup.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:4k
源码类别:

进程与线程

开发平台:

Java

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. public class BalanceLookup extends JPanel {
  5. private JTextField acctTF;
  6. private JTextField pinTF;
  7. private JButton searchB;
  8. private JButton cancelB;
  9. private JLabel balanceL;
  10. private volatile Thread lookupThread;
  11. public BalanceLookup() {
  12. buildGUI();
  13. hookupEvents();
  14. }
  15. private void buildGUI() {
  16. JLabel acctL = new JLabel("Account Number:");
  17. JLabel pinL = new JLabel("PIN:");
  18. acctTF = new JTextField(12);
  19. pinTF = new JTextField(4);
  20. JPanel dataEntryP = new JPanel();
  21. dataEntryP.setLayout(new FlowLayout(FlowLayout.CENTER));
  22. dataEntryP.add(acctL);
  23. dataEntryP.add(acctTF);
  24. dataEntryP.add(pinL);
  25. dataEntryP.add(pinTF);
  26. searchB = new JButton("Search");
  27. cancelB = new JButton("Cancel Search");
  28. cancelB.setEnabled(false);
  29. JPanel innerButtonP = new JPanel();
  30. innerButtonP.setLayout(new GridLayout(1, -1, 5, 5));
  31. innerButtonP.add(searchB);
  32. innerButtonP.add(cancelB);
  33. JPanel buttonP = new JPanel();
  34. buttonP.setLayout(new FlowLayout(FlowLayout.CENTER));
  35. buttonP.add(innerButtonP);
  36. JLabel balancePrefixL = new JLabel("Account Balance:");
  37. balanceL = new JLabel("BALANCE UNKNOWN");
  38. JPanel balanceP = new JPanel();
  39. balanceP.setLayout(new FlowLayout(FlowLayout.CENTER));
  40. balanceP.add(balancePrefixL);
  41. balanceP.add(balanceL);
  42. JPanel northP = new JPanel();
  43. northP.setLayout(new GridLayout(-1, 1, 5, 5));
  44. northP.add(dataEntryP);
  45. northP.add(buttonP);
  46. northP.add(balanceP);
  47. setLayout(new BorderLayout());
  48. add(northP, BorderLayout.NORTH);
  49. }
  50. private void hookupEvents() {
  51. searchB.addActionListener(new ActionListener() {
  52. public void actionPerformed(ActionEvent e) {
  53. search();
  54. }
  55. });
  56. cancelB.addActionListener(new ActionListener() {
  57. public void actionPerformed(ActionEvent e) {
  58. cancelSearch();
  59. }
  60. });
  61. }
  62. private void search() {
  63. // better be called by event thread!
  64. ensureEventThread();
  65. searchB.setEnabled(false);
  66. cancelB.setEnabled(true);
  67. balanceL.setText("SEARCHING ...");
  68. // get a snapshot of this info in case it changes
  69. String acct = acctTF.getText();
  70. String pin = pinTF.getText();
  71. lookupAsync(acct, pin);
  72. }
  73. private void lookupAsync(String acct, String pin) {
  74. // Called by event thread, but can be safely 
  75. // called by any thread.
  76. final String acctNum = acct;
  77. final String pinNum = pin;
  78. Runnable lookupRun = new Runnable() {
  79. public void run() {
  80. String bal = lookupBalance(acctNum, pinNum);
  81. setBalanceSafely(bal);
  82. }
  83. };
  84. lookupThread = new Thread(lookupRun, "lookupThread");
  85. lookupThread.start();
  86. }
  87. private String lookupBalance(String acct, String pin) {
  88. // Called by lookupThread, but can be safely 
  89. // called by any thread.
  90. try {
  91. // Simulate a lengthy search that takes 5 seconds
  92. // to communicate over the network.
  93. Thread.sleep(5000);
  94. // result "retrieved", return it
  95. return "1,234.56";
  96. } catch ( InterruptedException x ) {
  97. return "SEARCH CANCELLED";
  98. }
  99. }
  100. private void setBalanceSafely(String newBal) {
  101. // Called by lookupThread, but can be safely 
  102. // called by any thread.
  103. final String newBalance = newBal;
  104. Runnable r = new Runnable() {
  105. public void run() {
  106. try {
  107. setBalance(newBalance);
  108. } catch ( Exception x ) {
  109. x.printStackTrace();
  110. }
  111. }
  112. };
  113. SwingUtilities.invokeLater(r);
  114. }
  115. private void setBalance(String newBalance) {
  116. // better be called by event thread!
  117. ensureEventThread();
  118. balanceL.setText(newBalance);
  119. cancelB.setEnabled(false);
  120. searchB.setEnabled(true);
  121. }
  122. private void cancelSearch() {
  123. // better be called by event thread!
  124. ensureEventThread();
  125. cancelB.setEnabled(false); // prevent additional requests
  126. if ( lookupThread != null ) {
  127. lookupThread.interrupt();
  128. }
  129. }
  130. private void ensureEventThread() {
  131. // throws an exception if not invoked by the 
  132. // event thread.
  133. if ( SwingUtilities.isEventDispatchThread() ) {
  134. return;
  135. }
  136. throw new RuntimeException("only the event " +
  137. "thread should invoke this method");
  138. }
  139. public static void main(String[] args) {
  140. BalanceLookup bl = new BalanceLookup();
  141. JFrame f = new JFrame("Balance Lookup");
  142. f.addWindowListener(new WindowAdapter() {
  143. public void windowClosing(WindowEvent e) {
  144. System.exit(0);
  145. }
  146. });
  147. f.setContentPane(bl);
  148. f.setSize(400, 150);
  149. f.setVisible(true);
  150. }
  151. }