延迟setText标签java的问题

时间:2010-11-16 17:19:28

标签: java multithreading timer

我的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);
    }

3 个答案:

答案 0 :(得分:2)

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

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)方法执行时,首先设置三个定时器来触发事件两秒钟,然后写入标签。

时间
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:...”

你的所有计时器同时触发关闭,直到你调用Timer.stop()或者告诉它只用Timer.setRepeats(false)触发一次它们不会停止

答案 1 :(得分:0)

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

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