我目前正在使用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
两秒钟后,一切正常。
为什么会这样?
答案 0 :(得分:2)
因为计时器每秒运行50次,所以在主线程完成GUI初始化之前会触发多次。
在GUI准备就绪之前调用repaint()
不会导致调用paintComponent()
。
如果直到调用setVisible(true)
之后才启动计时器,您将获得预期的结果。