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应用程序编写,并且没有任何问题。