多个setText之间的延迟java

Delay between multiple setText java

我想在每个 if 之间设置一个延迟 我已经用 Thread.sleep() 进行了测试,但这会冻结 gui,我不知道在循环中使用多个摆动计时器是否可行。

我在这里尝试使用摆动计时器并一直冻结图形用户界面,我做错了什么?

int delay = 1000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      int i=0;
      public void actionPerformed(ActionEvent evt) {

          try
          {
                System.out.print(solucion.get(i)+" "+solucion.get(i+1)+" "+solucion.get(i+2)+" \n"+solucion.get(i+3)+" "+solucion.get(i+4)+" "+solucion.get(i+5)+" \n"+solucion.get(i+6)+" "+solucion.get(i+7)+" "+solucion.get(i+8));
                System.out.println("\n");

                Btn1.setText(solucion.get(i));
                Btn2.setText(solucion.get(i+1));
                Btn3.setText(solucion.get(i+2));
                Btn4.setText(solucion.get(i+3));
                Btn5.setText(solucion.get(i+4));
                Btn6.setText(solucion.get(i+5));
                Btn7.setText(solucion.get(i+6));
                Btn8.setText(solucion.get(i+7));
                Btn9.setText(solucion.get(i+8));


                i++;
          }
          catch(IndexOutOfBoundsException e){((Timer)evt.getSource()).stop();} //if it gets a error we are at the end of the list and stop the timer

      }
  };
  new Timer(delay, taskPerformer).start();

如果您希望 guid 不被冻结,您需要在不同的线程中执行它。 运行 它在主线程中将消失导致 guid 冻结。您正在使用 swing,所以要走的路是:

SwingUtilities.invokeLater(new Runnable() {
      public void run() {
          // put your statements and delay here
      }
  });

使用 Swing Timer。定时器取代了循环。

每次计时器触发时,您都会设置文本,然后递增 "i" 的值。当 "i" 达到特定值时,您将停止计时器。

请参阅:Jlabel showing both old and new numbers 一个简单的示例来帮助您入门。

阅读 How to Use Swing Timers 上的 Swing 教程部分了解更多信息。