多个setText java之间的延迟

问题描述 投票:0回答:2

我希望在每个if之间加一个延迟,因为我已经使用Thread.sleep()但是这会冻结gui并且我不知道在循环中使用多个摆动计时器是否可行。 enter image description here

在这里,我正在尝试使用摇摆计时器,并保持冻结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();
java swing delay freeze
2个回答
1
投票

使用Swing Timer。 Timer取代了循环。

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

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

有关更多信息,请阅读How to Use Swing Timers上Swing教程中的部分。


1
投票

如果你想让guid不冻结,你需要在另一个线程中执行它。在主线程中运行它将导致guid冻结。你正在使用秋千,所以要走的路是:

SwingUtilities.invokeLater(new Runnable() {
      public void run() {
          // put your statements and delay here
      }
  });
© www.soinside.com 2019 - 2024. All rights reserved.