在runnable中绘制字符串不起作用

时间:2016-07-08 10:23:50

标签: java jframe

我想在runnable中绘制一个字符串,然后几秒钟后,在该字符串中添加另一个单词,然后重复。 runnable有效,但它不会被drawString?

如果有人需要编译并试用它,我已经制作了一个只有我想要的迷你应用程序。

这是:

package timer.problem.example;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;

public class TimerProblemExample extends JFrame {

    private static final long serialVersionUID = 1L;

    public TimerProblemExample() {
        setBackground(Color.black);
        setVisible(true);
        setTitle("Timer Problem Example");
        setSize(950, 600);
        setDefaultCloseOperation(3);
    }

    public static void main(String[] args) {
        new TimerProblemExample();
    }

    public void timer(final Graphics graphics) {
        new Timer().schedule(new TimerTask() {
            int update = 6;
            public void run() {
                update--;
                graphics.setFont(new Font("Splash", Font.PLAIN, 60));
                graphics.setColor(Color.white);
                if (update == 5) {
                    graphics.drawString("Test", 50, 130);
                    repaint();
                }

                if (update == 3) {
                    graphics.drawString("Test Test", 50, 100);
                    repaint();
                }

                if (update == 1) {
                    graphics.drawString("Test Test Test", 50, 50);
                    repaint();
                }
            }
        }, 0L, 1000L);
    }

    @Override
    public void paint(Graphics graphics) {
        super.paint(graphics);

        timer(graphics);
    }
}

请帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

您的示例代码存在一些问题。 每次调用重绘时,都会创建一个新的计时器。你有很多运行(并且经常),每个人都在不断重新绘制,而不是UI可以更新。您可以通过添加System.out.println(" Timer thread:" + Thread.currentThread()。getId())来测试它;就在更新之前 - ;另外,对帧的任何更改(例如,通过拖动鼠标来改变它的大小)也会调用paint(),这会导致生成更多的计时器。 你真的不应该调用setVisible(true);直到您设置了JFrame的属性(大小,标题等)。它现在不是问题,但如果你打算向它添加组件,它就会成为一个问题。 我修改了您的代码,这可以根据您的需要进行操作。 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; 公共类TimerProblemExample扩展JFrame {     private static final long serialVersionUID = 1L;     public TimerProblemExample(){         的setBackground(Color.black);         setTitle("定时器问题示例");         setSize(950,600);         setDefaultCloseOperation(3);         调用setVisible(真);         计时器(的getGraphics()); //从这里调用计时器,所以只有一个正在运行     }     public static void main(String [] args){         新的TimerProblemExample();     }     public void timer(最终图形图形){         新的Timer()。schedule(新的TimerTask(){             int update = 6;             public void run(){                 update--;                 System.out.println(" Timer thread:" + Thread.currentThread()。getId());                 graphics.setFont(new Font(" Splash",Font.PLAIN,60));                 graphics.setColor(Color.white);                 if(update == 5){                     graphics.drawString(" Test",50,130);                 }                 if(update == 3){                     graphics.drawString(" Test Test",50,100);                 }                 if(update == 1){                     graphics.drawString(" Test Test Test",50,50);                 }                 //添加了此部分以使更新变量循环回来                 如果(更新< = 0)                 {                     update = 6;                 }             }         },1000L,1000L); // 0计时器启动的延迟是在第一秒产生很多线程。放慢了速度。不再需要延迟,但让它看到正在执行的drawString方法是有用的。     } } 最后,不要直接在Frame上绘制任何东西是个好主意。将JLabel添加到框架并将文本放入其中。