【问题标题】:Problem with delay setText label java延迟setText标签java的问题
【发布时间】:2010-11-16 17:19:28
【问题描述】:

我的 java 程序有一个大问题。 我尝试实现一个简单的软件。 有一个标签,我想在这个标签上标记一个文本,但这必须分开 2 秒。

我发现线程和 Swing 存在问题,我实现了这段代码,但结果没有改变。 你能帮我吗 谢谢

 public void stampChips1(int numberDecrement){

        ActionListener taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                jLabel1.setText("L'avversario ha deciso di togliere : . ");
            }
        };
        new javax.swing.Timer(2000, taskPerformer).start();


        ActionListener taskPerformer2 = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                jLabel1.setText("L'avversario ha deciso di togliere : . . ");
            }
        };
        new javax.swing.Timer(2000, taskPerformer2).start();


        ActionListener taskPerformer3 = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                jLabel1.setText("L'avversario ha deciso di togliere : . . .");
            }
        };
        new javax.swing.Timer(2000, taskPerformer3).start();



        jLabel1.setText("L'avversario ha deciso di togliere : " + numberDecrement);
    }

【问题讨论】:

    标签: java multithreading timer


    【解决方案1】:

    每次您在代码中调用 javax.swing.Timer.start() 时,它将继续每 2 秒触发一次事件(在您的构造函数中设置)。几次间隔后,您最终将有三个不同的计时器尝试(并成功)将文本设置在同一标签中。标签的文本将取决于哪个 Timer 的 ActionListener 最后完成执行。如果您希望 Timer 触发一次并停止,您应该像这样设置它:

    javax.swing.Timer tmr = new javax.swing.Timer(2000, taskPerformer);
    tmr.setRepeats(false);
    tmr.start();
    

    现在每个计时器只会触发一次,消除了标签上的任何覆盖问题。

    在 cmets 中按请求添加:

    当您设置每个计时器时,将其设置为仅触发一次(如 camickr 所述),为每个计时器设置不同的间隔。

    第一个计时器应该是:

    javax.swing.Timer tmr1 = new javax.swing.Timer(2000, taskPerformer);
    tmr1.setRepeats(false);
    tmr1.start();
    

    第二个计时器应该类似:tmr2 = new ... (4000, taskPerformer2);
    第三个定时器应该类似:tmr3 = new ... (6000, taskPerformer3);

    您的初始代码的问题在于,当您的 stampChips1(int) 方法执行时,它首先设置三个计时器以触发事件两秒,然后写入标签。

    时间
    0s - jLabel1 = "L'avversario ha deciso di togliere :" + numberDecrement
    ~2s - jLabel1 = "L'avversario ha deciso di togliere : ."
    ~2s - jlabel1 = "L'avversario ha deciso di togliere : . . "
    ~2s - jlabel1 = "L'avversario ha deciso di togliere : . . ."
    ~4s - jLabel1 = "L'avversario ha deciso di togliere : ."
    ~4s - jlabel1 = "L'avversario ha deciso di togliere : . . "
    ~4s - jlabel1 = "L'avversario ha deciso di togliere : . . ."

    您的所有计时器都在同时触发 close,并且它们不会停止,直到您调用 Timer.stop() 或使用 Timer.setRepeats(false) 告诉它只触发一次.

    【讨论】:

    • 你能发布一个简单的例子,因为我不明白你的解决方案。谢谢
    • 添加了一点,希望这可以帮助您了解问题所在。
    【解决方案2】:

    同样使用您的基本代码,您需要有不同的时间间隔(2000、4000、6000),否则所有计时器将同时触发。

    【讨论】:

      【解决方案3】:
      void uiFunction(JLabel label) {
      new Thread() {
          public void run() {
      
                  final jLabel1=label;
                  SwingUtilities.invokeLater(new Runnable() {
                      jLabel1.setText("L'avversario ha deciso di togliere : . ");
                      jLabel1.repaint();
                  }
                  Thread.sleep(2000);
                   SwingUtilities.invokeLater(new Runnable() {
                      jLabel1.setText("L'avversario ha deciso di togliere : .. ");
                      jLabel1.repaint();
                  }
                  Thread.sleep(2000);
      
                SwingUtilities.invokeLater(new Runnable() {
                      jLabel1.setText("L'avversario ha deciso di togliere : ... ");
                      jLabel1.repaint();
                  }
      
          }
      }.run();
      

      }

      我面临着类似的problem。如果你想让这种情况永远发生,你可以在无限循环中调用这个函数......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-12
        • 2011-01-14
        • 2018-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多