• <tfoot id='Bn00c'></tfoot>
      <i id='Bn00c'><tr id='Bn00c'><dt id='Bn00c'><q id='Bn00c'><span id='Bn00c'><b id='Bn00c'><form id='Bn00c'><ins id='Bn00c'></ins><ul id='Bn00c'></ul><sub id='Bn00c'></sub></form><legend id='Bn00c'></legend><bdo id='Bn00c'><pre id='Bn00c'><center id='Bn00c'></center></pre></bdo></b><th id='Bn00c'></th></span></q></dt></tr></i><div id='Bn00c'><tfoot id='Bn00c'></tfoot><dl id='Bn00c'><fieldset id='Bn00c'></fieldset></dl></div>

        <bdo id='Bn00c'></bdo><ul id='Bn00c'></ul>
      <legend id='Bn00c'><style id='Bn00c'><dir id='Bn00c'><q id='Bn00c'></q></dir></style></legend>

      <small id='Bn00c'></small><noframes id='Bn00c'>

        SwingWorker 没有响应

        时间:2023-05-28
        <legend id='HUnYr'><style id='HUnYr'><dir id='HUnYr'><q id='HUnYr'></q></dir></style></legend>

                <tbody id='HUnYr'></tbody>
            • <i id='HUnYr'><tr id='HUnYr'><dt id='HUnYr'><q id='HUnYr'><span id='HUnYr'><b id='HUnYr'><form id='HUnYr'><ins id='HUnYr'></ins><ul id='HUnYr'></ul><sub id='HUnYr'></sub></form><legend id='HUnYr'></legend><bdo id='HUnYr'><pre id='HUnYr'><center id='HUnYr'></center></pre></bdo></b><th id='HUnYr'></th></span></q></dt></tr></i><div id='HUnYr'><tfoot id='HUnYr'></tfoot><dl id='HUnYr'><fieldset id='HUnYr'></fieldset></dl></div>
            • <tfoot id='HUnYr'></tfoot>

                • <bdo id='HUnYr'></bdo><ul id='HUnYr'></ul>
                • <small id='HUnYr'></small><noframes id='HUnYr'>

                  本文介绍了SwingWorker 没有响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我想做什么?

                  点击Start JButtonSwingWorker就会执行.在 doInBackground() 方法内部,我将 arrNames 的每个索引传递给 publish() 方法,以便在内部显示JTextArea.

                  At the click of the Start JButton, the SwingWorker will execute. Inside the doInBackground() method, I am passing each index of arrNames, to the publish() method, so that it can be displayed inside the JTextArea.

                  发生了什么?

                  如果我保留行 System.out.format("Counter : %d%n", counter); 作为评论,在我的 SwingWorkerdoInBackground() 方法中,SwingWorker 正在按预期工作.虽然如果我将其注释掉,那么 SwingWorker 停止响应.

                  If I do not keep line System.out.format("Counter : %d%n", counter); as a comment, in my doInBackground() method of the SwingWorker, then the SwingWorker is working as expected. Though if I comment it out, then the SwingWorker stops responding.

                  我做错了吗?

                  java version "1.7.0_25"
                  Java(TM) SE Runtime Environment (build 1.7.0_25-b16)
                  Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode, sharing)
                  

                  这是我正在使用的代码:

                  Here is the code I am using :

                  import java.awt.*;
                  import java.awt.event.*;
                  import javax.swing.*;
                  
                  public class SwingWorkerExample1
                  {
                      private JLabel statusLabel;
                      private JTextArea tArea;
                      private JButton startButton;
                      private JButton stopButton;
                  
                      private BackgroundTask backgroundTask;
                  
                      private ActionListener buttonActions =
                                              new ActionListener()
                      {
                          @Override
                          public void actionPerformed(ActionEvent ae)
                          {
                              JButton source = (JButton) ae.getSource();
                              if (source == startButton)
                              {
                                  startButton.setEnabled(false);
                                  stopButton.setEnabled(true);
                                  backgroundTask = new BackgroundTask();
                                  backgroundTask.execute();
                              }
                              else if (source == stopButton)
                              {
                                  backgroundTask.cancel(true);
                                  stopButton.setEnabled(false);
                                  startButton.setEnabled(true);
                              }
                          }
                      };
                  
                      private void displayGUI()
                      {
                          JFrame frame = new JFrame("Swing Worker Example");
                          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                  
                          JPanel contentPane = new JPanel();
                          contentPane.setBorder(
                              BorderFactory.createEmptyBorder(5, 5, 5, 5));
                          contentPane.setLayout(new BorderLayout(5, 5));
                  
                          statusLabel = new JLabel("Status Bar", JLabel.CENTER);
                  
                          tArea = new JTextArea(20, 20);
                          tArea.setWrapStyleWord(true);
                          tArea.setLineWrap(true);        
                          JScrollPane textScroller = new JScrollPane();
                          textScroller.setBorder(
                              BorderFactory.createTitledBorder("Textual OUTPUT : "));
                          textScroller.setViewportView(tArea);
                  
                          startButton = new JButton("Start");
                          startButton.addActionListener(buttonActions);
                          stopButton = new JButton("Stop");
                          stopButton.setEnabled(false);
                          stopButton.addActionListener(buttonActions);
                          JPanel buttonPanel = new JPanel();
                          buttonPanel.add(startButton);
                          buttonPanel.add(stopButton);
                  
                          contentPane.add(statusLabel, BorderLayout.PAGE_START);
                          contentPane.add(textScroller, BorderLayout.CENTER);
                          contentPane.add(buttonPanel, BorderLayout.PAGE_END);
                  
                          frame.setContentPane(contentPane);
                          frame.pack();
                          frame.setLocationByPlatform(true);
                          frame.setVisible(true);
                      }
                  
                      private class BackgroundTask extends SwingWorker<Void, String>
                      {
                          private int counter = 0;
                  
                          private String[] arrNames = { "US Rates Strategy Cash",
                              "Pavan Wadhwa(1-212) 844-4597", "Srini Ramaswamy(1-212) 844-4983",
                              "Meera Chandan(1-212) 855-4555", "Kimberly Harano(1-212) 823-4996",
                              "Feng Deng(1-212) 855-2555", "US Rates Strategy Derivatives",
                              "Srini Ramaswamy(1-212) 811-4999",
                              "Alberto Iglesias(1-212) 898-5442",
                              "Praveen Korapaty(1-212) 812-3444", "Feng Deng(1-212) 812-2456",
                              "US Rates Strategy Derivatives", "Srini Ramaswamy(1-212) 822-4999",
                              "Alberto Iglesias(1-212) 822-5098",
                              "Praveen Korapaty(1-212) 812-3655", "Feng Deng(1-212) 899-2222" };
                  
                          public BackgroundTask()
                          {
                              statusLabel.setText((this.getState()).toString());
                              System.out.println(this.getState());
                          }
                  
                          @Override
                          protected Void doInBackground()
                          {
                              statusLabel.setText((this.getState()).toString());
                              System.out.println(this.getState());
                              while (!isCancelled())
                              {
                                  counter %= arrNames.length;
                                  //System.out.format("Counter : %d%n", counter);
                                  publish(arrNames[counter]);
                                  counter++;
                              }
                              statusLabel.setText((this.getState()).toString());
                              System.out.println(this.getState());
                              return null;
                          }
                  
                          @Override
                          protected void process(java.util.List<String> messages)
                          {
                              for (String message : messages)
                                  tArea.append(String.format(message + "%n"));
                          }
                      }
                  
                      public static void main(String[] args)
                      {
                          Runnable runnable = new Runnable()
                          {
                              @Override
                              public void run()
                              {
                                  new SwingWorkerExample1().displayGUI();
                              }
                          };
                          EventQueue.invokeLater(runnable);
                      }
                  }
                  

                  编辑 1:

                  按照建议,如果我添加 Thread.sleep(...),它确实可以工作,但它会抛出一个 InterruptedException,如下所示.所以这个技巧奏效了.但这是合法的执行方式吗?

                  As suggested, if I add Thread.sleep(...), it does work, though, it throws a InterruptedException as shown below. So the trick works. But is this the legitimate way of performing it ?

                  C:MineJAVAJ2SEclasses>java SwingWorkerExample1
                  PENDING
                  STARTED
                  java.lang.InterruptedException: sleep interrupted
                          at java.lang.Thread.sleep(Native Method)
                          at SwingWorkerExample1$BackgroundTask.doInBackground(SwingWorkerExample1.java:108)
                          at SwingWorkerExample1$BackgroundTask.doInBackground(SwingWorkerExample1.java:76)
                          at javax.swing.SwingWorker$1.call(SwingWorker.java:296)
                          at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
                          at java.util.concurrent.FutureTask.run(FutureTask.java:166)
                          at javax.swing.SwingWorker.run(SwingWorker.java:335)
                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
                          at java.lang.Thread.run(Thread.java:724)
                  DONE
                  

                  <小时>

                  编辑 2:

                  只有 doInBackground() 发生了变化,引发了上述异常:


                  EDIT 2 :

                  Only doInBackground() is changed, that raised the above exception :

                  @Override
                  protected Void doInBackground()
                  {
                      Runnable runnable = new Runnable()
                      {
                          @Override
                          public void run()
                          {
                              statusLabel.setText((BackgroundTask.this.getState()).toString());
                          }
                      };
                      EventQueue.invokeLater(runnable);
                  
                      System.out.println(this.getState());
                      while (!isCancelled())
                      {
                          counter %= arrNames.length;             
                          //System.out.format("Counter : %d%n", counter);
                          publish(arrNames[counter]);
                          try
                          {Thread.sleep(30);}
                          catch(InterruptedException ie)
                          {ie.printStackTrace();}
                          counter++;
                      }
                      runnable = new Runnable()
                      {
                          @Override
                          public void run()
                          {
                              statusLabel.setText((BackgroundTask.this.getState()).toString());
                          }
                      };
                      EventQueue.invokeLater(runnable);
                      System.out.println(this.getState());
                      return null;
                  }
                  

                  推荐答案

                  如果我添加 Thread.sleep(...),它确实有效,但它会抛出一个中断异常

                  if I add Thread.sleep(...), it does work, though, it throws a InterruptedException

                  显然产生异常的代码(复制自 OP 的编辑):

                  The code that apparently produces the exception (copied from OP's edit):

                  while (!isCancelled()) {
                      counter %= arrNames.length;
                      // System.out.format("Counter : %d%n", counter);
                      publish(arrNames[counter]);
                      try {
                          Thread.sleep(30); // throws
                      } catch (InterruptedException ie) {
                          ie.printStackTrace();
                      }
                      counter++;
                  }
                  

                  不过,原因是取消工作人员的代码(在 actionListener 中):

                  The reason, though, is the code that cancels the worker (in the actionListener):

                  backgroundTask.cancel(true);
                  

                  它明确告诉工作人员通过 .. 中断线程来取消.从它的 api 文档:

                  which explicitly tells the worker to cancel by .. interrupting the thread. From its api doc:

                  mayInterruptIfRunning - 如果执行此任务的线程应该被中断,则为 true;否则,允许完成正在进行的任务

                  mayInterruptIfRunning - true if the thread executing this task should be interrupted; otherwise, in-progress tasks are allowed to complete

                  顺便说一句:捕获异常并且什么都不做(从而有效地忽略中断)并不是最好的想法.在这种情况下可能不会造成太大的破坏 - 由于检查了取消的状态.典型的工作实现要么在需要时进行一些内部清理之后捕获并返回,要么根本不处理它.

                  As an aside: catching the exception and doing nothing (thereby effectively ignoring the interrupt) is not the best of ideas. Probably not too damaging in this case - due to checking the cancelled status. Typical worker implementations either catch and return, after doing some internal cleanup if needed, or don't handle it at all.

                  这篇关于SwingWorker 没有响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:java, 以粗体打印 下一篇:如何在java中获取给定的日期字符串格式(模式)?

                  相关文章

                  <tfoot id='RyYhw'></tfoot>

                        <bdo id='RyYhw'></bdo><ul id='RyYhw'></ul>
                      <i id='RyYhw'><tr id='RyYhw'><dt id='RyYhw'><q id='RyYhw'><span id='RyYhw'><b id='RyYhw'><form id='RyYhw'><ins id='RyYhw'></ins><ul id='RyYhw'></ul><sub id='RyYhw'></sub></form><legend id='RyYhw'></legend><bdo id='RyYhw'><pre id='RyYhw'><center id='RyYhw'></center></pre></bdo></b><th id='RyYhw'></th></span></q></dt></tr></i><div id='RyYhw'><tfoot id='RyYhw'></tfoot><dl id='RyYhw'><fieldset id='RyYhw'></fieldset></dl></div>

                    1. <legend id='RyYhw'><style id='RyYhw'><dir id='RyYhw'><q id='RyYhw'></q></dir></style></legend>

                    2. <small id='RyYhw'></small><noframes id='RyYhw'>