Java applet中的移动圆闪烁
我创建了一个带有红色圆圈的小程序,可以从左上角移动到右下角。这会发生,但整个帧都在闪烁,即使我将圆生成为缓冲图像。代码如下:Java applet中的移动圆闪烁,java,swing,animation,applet,Java,Swing,Animation,Applet,我创建了一个带有红色圆圈的小程序,可以从左上角移动到右下角。这会发生,但整个帧都在闪烁,即使我将圆生成为缓冲图像。代码如下: import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import javax.swing.JApplet; public class MovingCircleApplet extends
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.swing.JApplet;
public class MovingCircleApplet extends JApplet implements Runnable {
private int x_pos;
private int y_pos;
private int radius;
private Thread circle;
@Override
public void init() {
x_pos = 20;
y_pos = 40;
radius = 10;
setSize(245,265);
circle = new Thread(this);
circle.start();
}
@Override
public void run()
{
while (true)
{
// redraw
repaint();
try
{
// sleep thread for 20 milliseconds
Thread.sleep(20);
}
catch (InterruptedException e)
{
System.out.println("Terminated prematurely due to interruption");
}
// move circle to lower right corner
if (x_pos < 225)
{
x_pos++;
y_pos++;
}
// restart at top right corner
else
{
x_pos = 20;
y_pos = 40;
}
}
}
@Override
public void paint(Graphics g)
{
super.paint(g);
g.drawImage(getFrame(), 0, 0, null);
}
private Image getFrame()
{
// Buffered image to prevent flickering
BufferedImage img = new BufferedImage(getWidth(),getHeight(),
BufferedImage.TYPE_3BYTE_BGR);
Graphics g = img.getGraphics();
// white background
g.setColor(Color.WHITE);
g.fillRect(0,0,getWidth(),getHeight());
// red circle
g.setColor(Color.RED);
g.fillOval(x_pos-radius, y_pos-radius, 2*radius, 2*radius);
//
g.dispose();
return img;
}
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.image.buffereImage;
导入javax.swing.JApplet;
公共类MovingCircleApplet扩展了JApplet实现Runnable{
私人国际邮政局;
私人国际邮政局;
私有整数半径;
私有线程圈;
@凌驾
公共void init(){
x_pos=20;
y_pos=40;
半径=10;
设置大小(245265);
圆圈=新螺纹(此);
圈。开始();
}
@凌驾
公开募捐
{
while(true)
{
//重画
重新油漆();
尝试
{
//睡眠线程20毫秒
睡眠(20);
}
捕捉(中断异常e)
{
System.out.println(“由于中断而提前终止”);
}
//将圆移动到右下角
如果(x_位置<225)
{
x_pos++;
y_pos++;
}
//在右上角重新启动
其他的
{
x_pos=20;
y_pos=40;
}
}
}
@凌驾
公共空间涂料(图g)
{
超级油漆(g);
g、 drawImage(getFrame(),0,0,null);
}
私有映像getFrame()
{
//缓冲图像以防止闪烁
BuffereImage img=新的BuffereImage(getWidth(),getHeight(),
buffereImage.TYPE_3BYTE_BGR);
Graphics g=img.getGraphics();
//白色背景
g、 setColor(Color.WHITE);
g、 fillRect(0,0,getWidth(),getHeight());
//红圈
g、 setColor(Color.RED);
g、 圆角(x_位置半径,y_位置半径,2*半径,2*半径);
//
g、 处置();
返回img;
}
}
1)为什么要编写小程序?如果是老师指定的,请参考。2) 在Swing中进行绘制的最佳方法是启动调用repaint()
3)g.drawImage(getFrame(),0,0,null)的javax.Swing.Timer
应该改为g.drawImage(getFrame(),0,0,this)代码>。我需要将其作为小程序编写。从上面的评论中,我不清楚应该如何修改我的applet使其工作。我在drawImage方法调用中将“null”改为“this”,但它没有改变任何内容。屏幕仍在闪烁。“我被要求将其作为小程序编写。”是谁要求的。。你的老师?“从上面的评论中,我不清楚应该如何修改我的applet以使其工作。”我不确定这是一个问题,事实上,我非常确定这不是一个问题。但是,别指望被人这样欺负。尝试一下(至少在你最喜欢的搜索引擎中插入“动画摆动计时器”,看看会弹出什么)。“我在drawImage方法调用中将“null”改为“this”,但它没有改变任何东西。”它只在异步加载图像时才改变某些内容。我们不应该假设……被允许作为JFrame应用程序编写,并且没有任何问题。