gpt4 book ai didi

java - Repaint() 没有在 Java while 循环中被调用

转载 作者:行者123 更新时间:2023-11-29 08:01:08 24 4
gpt4 key购买 nike

我正在尝试用 Java 创建一个简单的动画,显示一个蓝色的球在 500 x 500 的窗口中水平移动。球应该以 1px/30ms 的速度移动。问题是,窗口仅在 while 循环退出时才被绘制,而不是像我预期的那样在 while 循环的每次迭代期间绘制。这导致蓝色球在其最终位置被绘制。你能告诉我我在这里做错了什么吗?我还尝试使用 paintComponent() 方法在 EDT 上执行此代码并得到相同的结果。此外,正如其他帖子所建议的那样,在使用 EDT 和 paintComponent() 方法时使用 paintImmediately(0, 0, getWidth(), getHeight()) 而不是 repaint() 时我得到了相同的结果。我试图在不使用计时器的情况下完成所有这些工作。

import javax.swing.*;
import java.awt.*;

class AnimationFrame extends JPanel {

int ovalX = 50;
long animDuration = 5000;
long currentTime = System.nanoTime() / 1000000;
long startTime = currentTime;
long elapsedTime = currentTime - startTime;

public AnimationFrame() {
setPreferredSize(new Dimension(500, 500));
runAnimation();
}

public void runAnimation() {
while (elapsedTime < animDuration) {
currentTime = System.nanoTime() / 1000000;
elapsedTime = currentTime - startTime;
System.out.println(elapsedTime);
ovalX = ovalX + 1;
try {
Thread.sleep(30);
}
catch (Exception e) {
}
repaint();
}
}

public void paint(Graphics g) {
Rectangle clip = g.getClipBounds();
g.setColor(Color.BLACK);
g.fillRect(clip.x, clip.y, clip.width, clip.height);
g.setColor(Color.BLUE);
g.fillOval(ovalX, 250, 70, 70);
}

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

public static void createAndShowGUI() {
JFrame mainFrame = new JFrame();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.add(new AnimationFrame());
mainFrame.pack();
mainFrame.setVisible(true);
}
}

最佳答案

我查看了您的代码,注意到您正在从要添加到“mainFrame”的“AnimationFrame”的构造函数中调用运行动画的方法。

这样做的问题在于,您试图在对象完成构建之前制作动画,必须在将其添加到 mainFrame 之前完成,而 mainFrame 尚未在屏幕上可见。

我对您的代码进行了以下更改,现在我看到一个蓝色的球在框架上移动。

import javax.swing.*;
import java.awt.*;

class AnimationFrame extends JPanel {

int ovalX = 50;
long animDuration = 5000;
long currentTime = System.nanoTime() / 1000000;
long startTime = currentTime;
long elapsedTime = currentTime - startTime;

public AnimationFrame() {
setPreferredSize(new Dimension(500, 500));
//i removed the call to runAnimation from here

}

public void runAnimation() {
while (elapsedTime < animDuration) {
currentTime = System.nanoTime() / 1000000;
elapsedTime = currentTime - startTime;
System.out.println(elapsedTime);
ovalX = ovalX + 1;
try {
Thread.sleep(30);
}
catch (Exception e) {
}
repaint();
}
}

@Override
public void paint(Graphics g) {
Rectangle clip = g.getClipBounds();
g.setColor(Color.BLACK);
g.fillRect(clip.x, clip.y, clip.width, clip.height);
g.setColor(Color.BLUE);
g.fillOval(ovalX, 250, 70, 70);
}

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

public static void createAndShowGUI() {
JFrame mainFrame = new JFrame();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
AnimationFrame animationPanel = new AnimationFrame();
mainFrame.add(animationPanel);
mainFrame.pack();
mainFrame.setVisible(true);
//I made the call to runAnimation here now
//after the containing frame is visible.
animationPanel.runAnimation();
}
}

关于java - Repaint() 没有在 Java while 循环中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14344431/

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