Java 画布上闪烁的白色

Java 画布上闪烁的白色,java,canvas,flicker,Java,Canvas,Flicker,我在发帖几分钟后想出了一个解决方案,但由于声誉不好,我无法删除该帖子 为了好玩,我决定开始做一些可能在某个时候变成游戏的东西 我正在试着画一些圆,并把它们朝着给定的方向移动。这会导致闪烁。很有可能我监督了一些非常基本的东西,但我不明白为什么它不能顺利呈现 我的board类看起来像(删除了我认为不必要的内容): 油漆方法: public void paint(Graphics g1) { super.paint(g1); Graphics2D g = (Gr

我在发帖几分钟后想出了一个解决方案,但由于声誉不好,我无法删除该帖子

为了好玩,我决定开始做一些可能在某个时候变成游戏的东西

我正在试着画一些圆,并把它们朝着给定的方向移动。这会导致闪烁。很有可能我监督了一些非常基本的东西,但我不明白为什么它不能顺利呈现

我的board类看起来像(删除了我认为不必要的内容):

油漆方法:

    public void paint(Graphics g1) {
        super.paint(g1);
        Graphics2D g = (Graphics2D) g1;
        for (Ball ball : Ball.BALLS) {
            g.drawOval((int) ball.getLocation().getX(), (int) ball.getLocation().getY(), ball.getRadius(),  ball.getRadius());
        }
    }
我的处理方法:

private void process() {
    if (utilities.randInt(1, 100) < 10 && Ball.getBallCount() < 40) {
        Ball.spawnNew(this);
    }
    for (Ball ball : Ball.BALLS) {
        ball.move(this);
    }
    Ball.BALLS.removeAll(Ball.TO_REMOVE);
    Ball.TO_REMOVE.clear();
}
private void进程(){
if(utilities.randInt(1100)<10&&Ball.getBallCount()<40){
新的(这个);
}
为了(球:球,球){
球。移动(这个);
}
Ball.BALLS.removeAll(Ball.TO_REMOVE);
球。要移除。清除();
}
move方法基本上是每次调用球时,将球的x值增加一个给定值(向右移动)

就像我说的,我不确定它为什么会闪烁,所以如果你有任何指针,请告诉我


谢谢

这听起来像是需要执行双缓冲的情况,以便在更新另一个画布时,画布的一个副本可以保持显示

这里使用的是AWT,我不知道如何使用AWT手动实现双缓冲。然而,如果您愿意在这里使用Swing,您可以利用自动双缓冲。请参阅有关的问题以及Oracle Technology Network关于的文章

其基本思想是:

  • 扩展而不是画布(这意味着当您重写
    paint(Graphics)
    时,您现在正在从javax.swing.JComponent而不是java.awt.Component重写它)
  • 使用
    super(true)
    创建构造函数以启用双缓冲

  • 编辑:另外,您最好覆盖
    paintComponent(Graphics)
    ,并包括对
    super.paintComponent(Graphics)
    的调用。请参阅。

    您需要双缓冲。为此,您需要创建一个
    buffereImage
    并从中获取
    图形。为图像绘制所有内容,将图像渲染到屏幕上,然后最后使用背景色或图像填充图像以重置它

    样本:

    //one time instantiation
    BufferedImage b = new BufferedImage(width, height, mode);
    
    绘制(图形g)
    中:

    //one time instantiation
    BufferedImage b = new BufferedImage(width, height, mode);
    
    Graphics buffer = b.getGraphics();
    //render all of the stuff on to buffer
    Graphics2D g = (Graphics2D) buffer;
        for (Ball ball : Ball.BALLS) {
            g.drawOval((int) ball.getLocation().getX(), (int) ball.getLocation().getY(), ball.getRadius(),  ball.getRadius());
        }
    g1.drawImage(b, 0, 0, width, height, null);
    g.setColor(Color.BLACK);
    //reset the image
    g.drawRect(0, 0, width, height);
    g.dispose();