gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:21:59 25 4
gpt4 key购买 nike

我有一个简单的小程序,可以沿 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com