多个setText java

时间:2019-02-24 18:23:28

标签: java swing delay freeze

我想在每个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();

2 个答案:

答案 0 :(得分:1)

如果您不希望GUID冻结,则需要在其他线程中执行它。在主线程中运行它会导致GUID冻结。您正在使用秋千,所以要走的路是:

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

答案 1 :(得分:1)

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

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

请参见:Jlabel showing both old and new numbers,以获取一个入门的简单示例。

阅读How to Use Swing Timers的Swing教程中的部分,以获得更多信息。