Java while循环中未调用Repaint()
我试图用Java创建一个简单的动画,显示一个蓝色的球在500 x 500的窗口中水平移动。球应该以1px/30ms的速度移动。问题是,窗口只在while循环退出时才被绘制,而不是在while循环的每次迭代中绘制。这将导致蓝色球在其最终位置被绘制。你能告诉我我做错了什么吗?我还尝试在EDT上使用paintComponent()方法执行此代码,并得到了相同的结果。此外,正如其他帖子所建议的,我在使用EDT和paintComponent()方法时使用paintInstance(0,0,getWidth(),getHeight())而不是repaint()得到了相同的结果。我正在尝试不用定时器来完成所有这些Java while循环中未调用Repaint(),java,swing,animation,awt,Java,Swing,Animation,Awt,我试图用Java创建一个简单的动画,显示一个蓝色的球在500 x 500的窗口中水平移动。球应该以1px/30ms的速度移动。问题是,窗口只在while循环退出时才被绘制,而不是在while循环的每次迭代中绘制。这将导致蓝色球在其最终位置被绘制。你能告诉我我做错了什么吗?我还尝试在EDT上使用paintComponent()方法执行此代码,并得到了相同的结果。此外,正如其他帖子所建议的,我在使用EDT和paintComponent()方法时使用paintInstance(0,0,getWidth
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);
}
}
import javax.swing.*;
导入java.awt.*;
类AnimationFrame扩展了JPanel{
int ovalX=50;
长持续时间=5000;
长currentTime=System.nanoTime()/1000000;
长启动时间=当前时间;
long elapsedTime=当前时间-开始时间;
公共动画框架(){
setPreferredSize(新尺寸(500500));
运行动画();
}
public void runAnimation(){
while(elapsedTime
您需要在单独的线程中执行循环。请参阅本教程-您需要在单独的线程中执行循环。请参阅本教程-我查看了您的代码,注意到您正在调用从“AnimationFrame”的构造函数中运行动画的方法,该构造函数将添加到“大型机”中
这样做的问题是,您试图在对象完成构造之前设置动画,而在将其添加到主机之前,必须先完成动画,而主机尚未在屏幕上显示
我对你的代码做了如下更改,现在我看到一个蓝色的球在画面上移动
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();
}
}
import javax.swing.*;
导入java.awt.*;
类AnimationFrame扩展了JPanel{
int ovalX=50;
长持续时间=5000;
长currentTime=System.nanoTime()/1000000;
长启动时间=当前时间;
long elapsedTime=当前时间-开始时间;
公共动画框架(){
setPreferredSize(新尺寸(500500));
//我从这里删除了对runAnimation的调用
}
public void runAnimation(){
while(elapsedTime
我查看了您的代码,注意到您正在调用从“AnimationFrame”的构造函数中运行动画的方法,该构造函数将添加到“大型机”中
这样做的问题是,您试图在对象完成构造之前设置动画,而在将其添加到主机之前,必须先完成动画,而主机尚未在屏幕上显示
我对你的代码做了如下更改,现在我看到一个蓝色的球在画面上移动
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();
}
}
import javax.swing.*;
导入java.awt.*;
类AnimationFrame扩展了JPanel{
int ovalX=50;
长持续时间=5000;
长currentTime=System.nanoTime()/1000000;
长启动时间=当前时间;
long elapsedTime=当前时间-开始时间;
公共动画框架(){
setPreferredSize(新尺寸(500500));
//我从这里删除了对runAnimation的调用
}
public void runAnimation(){
while(elapsedTime