gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:44:16 29 4
gpt4 key购买 nike

我目前正在使用 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

两秒钟后,一切都按预期进行。

为什么会发生这种情况?

最佳答案

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

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

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

关于java - 为什么 Java Graphics2D 'drawString' 停止 repaint()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53935857/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com