• <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 没有响应

        SwingWorker not responding(SwingWorker 没有响应)
        <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 没有响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  How to send data to COM PORT using JAVA?(如何使用 JAVA 向 COM PORT 发送数据?)
                  How to make a report page direction to change to quot;rtlquot;?(如何使报表页面方向更改为“rtl?)
                  Use cyrillic .properties file in eclipse project(在 Eclipse 项目中使用西里尔文 .properties 文件)
                  Is there any way to detect an RTL language in Java?(有没有办法在 Java 中检测 RTL 语言?)
                  How to load resource bundle messages from DB in Java?(如何在 Java 中从 DB 加载资源包消息?)
                  How do I change the default locale settings in Java to make them consistent?(如何更改 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>

                          <tbody id='RyYhw'></tbody>
                        <legend id='RyYhw'><style id='RyYhw'><dir id='RyYhw'><q id='RyYhw'></q></dir></style></legend>

                          • <small id='RyYhw'></small><noframes id='RyYhw'>