2010-11-16 68 views
3

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

我看到了线程和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); 
    } 
+0

凌乱的代码,我的朋友 – 2010-11-16 17:29:27

回答

2

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

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

现在每个定时器只有一次火,消除了由于标签上的任何覆盖问题。

增加每个请求的评论:

当您设置每一个定时器,将它设置为只火一次(和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)方法执行它首先设置三个定时器来触发事件EVERY两秒钟,然后写入标签。

时间
0 - jLabel1的= “L'avversario公顷deciso二togliere:” + numberDecrement
〜2秒 - jLabel1的= “L'avversario公顷deciso二togliere:”
〜2秒 - JLabel1所做=“L 'avversario ha deciso di togliere:。“
〜2s - jlabel1 =”L'avversario ha deciso di togliere:......“
〜4S - jLabel1的= “L'avversario公顷deciso二togliere:”
〜4S - JLabel1所做= “L'avversario公顷deciso二togliere:”
〜4S - JLabel1所做=“L'avversario公顷deciso di togliere:......“

所有的定时器都在同一时间触发关闭,它们不会停止,直到调用Timer.stop()或通过Timer.setRepeats(false)指示它只触发一次。

+0

你可以发布一个简单的例子,因为我不明白你的解决方案。谢谢 – zp26 2010-11-16 20:06:41

+0

增加了一点,希望这可以帮助你了解问题所在。 – 2010-11-16 20:51:30

0

也使用你的基本代码,你需要有不同的时间间隔(2000,4000,6000),否则所有的定时器会同时触发。

0
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。你可以在无限循环中调用这个函数,如果你希望这种情况永远发生...