为什么Java Graphics2D'drawString'停止repaint()?

时间:2018-12-26 18:42:52

标签: java swing graphics

我目前正在使用Java Swing创建游戏。我需要一个计分器,因此我正在使用Graphics2D方法drawString进行绘制。

我删除了所有不会改变代码中问题的内容,最终我发现问题是drawString方法。

这是我的完整代码:(Problem / src / defaultpackage / Problem.java)

// All the imports are here
public class Problem extends JPanel {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Problem problem = new Problem();
        frame.add(problem);

        frame.setTitle("Problem");
        frame.setSize(350, 720);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.requestFocus();
        frame.setVisible(true);
    }
    public Problem() {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new ScheduleTask(),0,20);
        // Changing '20' doesn't work
    }
    private void draw(Graphics g) {
        System.out.println("draw");
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawString("S", 100, 100);
        // If I remove this and replace it by:
        //g2d.fillRect(0, 0, 100, 100);
        // it works just fine
    }
    @Override
    public void paintComponent(Graphics g) {
        System.out.println("paintcomponent");
        super.paintComponent(g);
        draw(g);
    }
    private class ScheduleTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("repaint");
            repaint();
        }
    }
} 

我希望输出为:

repaint
paintcomponent
draw
repaint
paintcomponent
draw

,依此类推。但是,相反,在程序运行的前两秒钟,输出仅为:

repaint
repaint
repaint

两秒钟后,一切正常。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

因为计时器每秒运行50次,所以在主线程完成GUI初始化之前会触发多次。

在GUI准备就绪之前调用repaint()不会导致调用paintComponent()

如果直到调用setVisible(true)之后才启动计时器,您将获得预期的结果。