java - 在简单的 Java 动画中停止闪烁

标签 java swing timer paint japplet

我有一个简单的小程序,可以沿 Canvas 的 x 轴对矩形进行动画处理。问题是它会闪烁。我尝试用 Google 搜索这个问题,但没有找到任何有用的信息或任何我理解的信息。

我对 Java 比较陌生。

谢谢!

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.*; 

public class simpleAnimation extends JApplet implements ActionListener { 
    Timer tm = new Timer(10, this); 
    int x = 0, velX = 2;

    public void actionPerformed(ActionEvent event) { 
        if (x < 0 || x > 550){ 
            velX = -velX; 
        }

        x = x + velX; 
        repaint(); 
    }

    public void paint ( Graphics g ) { 
    super.paint(g); 
    g.setColor(Color.RED); 
    g.fillRect(x, 30, 50, 30); 
    tm.start(); 
    } 
}

**********更新后的代码没有闪烁**********

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

public class simpleAnimation extends JApplet implements ActionListener  
{ 

     Graphics bufferGraphics; 

     Image offscreen; 

     Dimension dim; 

     int x = 3, velX = 2;

     Timer tm = new Timer(10, this);

     public void init()  
     { 

          dim = getSize(); 

          offscreen = createImage(dim.width,dim.height); 

          bufferGraphics = offscreen.getGraphics(); 
     }

      public void paint(Graphics g)  
     { 

          bufferGraphics.clearRect(0,0,dim.width,dim.width); 

          bufferGraphics.setColor(Color.red); 

          bufferGraphics.fillRect(x,50,50,20); 

          g.drawImage(offscreen,0,0,this); 

          tm.start();   

     }

     public void update(Graphics g) 
     { 

          paint(g); 

     } 

    public void actionPerformed(ActionEvent evt) 
    {   

        if ( x < 0 || x > 550){

            velX = -velX;

        }

        x = x + velX;   

        repaint();

    }

 }

我用过这个applet作为模板。

最佳答案

我总是对双缓冲的概念感到困惑。

这是我的示例,它重写了 JApplet 的 Paint() 和 JPanel 的 PaintComponent(),默认情况下使用双缓冲。

我没有看到明显的闪烁有任何差异。

//<applet code="SimpleAnimation.class" width="600" height="300"></applet>
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.*;

public class SimpleAnimation extends JApplet implements ActionListener {
    Timer tm = new Timer(10, this);
    int x = 0, velX = 2;
    JPanel panel;

    public void init()
    {
        panel = new JPanel()
        {
            @Override
            public Dimension getPreferredSize()
            {
                return new Dimension(50, 100);
            }

            @Override
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.setColor(Color.RED);
                g.fillRect(x, 30, 50, 30);

            }
        };
        add(panel, BorderLayout.SOUTH);

        tm.start();
    }

    public void actionPerformed(ActionEvent event) {
        if (x < 0 || x > 550){
            velX = -velX;
        }

        x = x + velX;
        repaint();
//        panel.repaint();
    }

    public void paint ( Graphics g ) {
    super.paint(g);
    g.setColor(Color.RED);
    g.fillRect(x, 30, 50, 30);
    }
}

我使用以下代码测试代码:appletviewer SimpleAnimation.java

我的双缓冲概念有缺陷,还是我的实现有缺陷,或者两者都有缺陷?

关于java - 在简单的 Java 动画中停止闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19774720/

相关文章:

c# - 我应该在我的代码中使用 thread.sleep 还是定时器?

java - Redisson 服务器交互

Android 定时器只触发一次

javascript - 如何在不卡住浏览器的情况下在 JavaScript 中使用计时器循环?

Java GridBagLayout 和 JPanel 错误 : cannot add to layout: constraint must be a string (or null)

java - jscrollpane 滚动面板

Java Graphics2D 图像移动

java - 类无法转换为 ParameterizedType

JavaFx Webview HTML5 拖放

java - 使用 JOptionPane Unresolved 编译问题异常