Swing Java小程序\u Dubble缓冲不起作用

Swing Java小程序\u Dubble缓冲不起作用,swing,applet,japplet,double-buffering,Swing,Applet,Japplet,Double Buffering,我正在用Java编写一个JApplet,但是dubble缓冲并不能消除闪烁 我该怎么办 我想这是代码的重要部分(如果您需要了解更多,请告诉我): 我感谢所有能得到的帮助!:) 我做了一个MCVE,让你更好地了解这个问题(感谢安德鲁·汤普森) “主要”-类别: Swingis,IMHO。为什么要手动使用update()方法?是什么促使你做出这个决定的?关于您试图完成的内容的一些想法将非常有用,例如您的想法,以及哪些没有成功或以何种方式成功?来自Java Docs Container类的一段小引文指

我正在用Java编写一个JApplet,但是dubble缓冲并不能消除闪烁

我该怎么办

我想这是代码的重要部分(如果您需要了解更多,请告诉我):


我感谢所有能得到的帮助!:)

我做了一个MCVE,让你更好地了解这个问题(感谢安德鲁·汤普森)

“主要”-类别:


Swing
is,IMHO。为什么要手动使用
update()
方法?是什么促使你做出这个决定的?关于您试图完成的内容的一些想法将非常有用,例如您的想法,以及哪些没有成功或以何种方式成功?来自
Java Docs Container
类的一段小引文指出:“更新容器。这会将更新转发到此容器的子组件。如果重新实现此方法,则应调用super.update(g),以便适当渲染轻量级组件,或直接调用paint(g)。如果子组件被g中的当前剪裁设置完全剪裁,则update()将不会转发给该子组件。“很抱歉,我对Java游戏编程还很陌生,所以我尝试了一些方法来解决这个问题。显然你是对的,因为它根本不起作用,但我该如何修复闪烁呢?您需要查看所有代码吗?如果您使用
JPanel
来绘制,而不是直接在
JApplet
上绘制,那么就很容易了。请看看这个。这只是一个简单的起点。为了更快地获得更好的帮助,请发布一个(最简单的完整且可验证的示例)。
    // Background (dubble buffering)
    private Image backbuffer;
    private Graphics backg;

//Init method
            // Dubble-Buffering
        backbuffer = createImage(getWidth(), getHeight());
        backg = backbuffer.getGraphics();
        backg.setColor(this.getBackground());

//Overrided update method
       public void update( Graphics g ) {
          g.drawImage( backbuffer, 0, 0, this );
          getToolkit().sync();
       }
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.Timer;

public class Test extends JApplet implements ActionListener {

JButton start;

int delay;
Timer tm;

// Falling balls
int n; // Total balls
Ball[] ball; // Array with the balls in

int score;

// The amount of balls falling at the same time (increases by one every
// 10:th score)
int ballNr;

// Comment to the game
String comment;

public void init() {

    this.setLayout(null);
    this.setSize(600, 500);
    this.getContentPane().setBackground(Color.cyan);
    this.setFocusable(true);

    score = 0;
    ballNr = 3;
    comment = "Avoid the balls!";

    // Buttons
    start = new JButton("START");
    add(start);
    start.setBounds(0, 400, 200, 100);
    start.addActionListener(this);

    // The timer
    delay = 12;
    tm = new Timer(delay, this);

    // The falling balls
    n = 12; // Number of balls in total
    ball = new Ball[n];
    // Declaring twelve new instances of the ball-object with a
    // "reference array"
    for (int i = 0; i < n; i++) {
        ball[i] = new Ball();
    }
}

// Paint-method //
public void paint(Graphics g) {
    super.paint(g);

    // Every 10:th score, the game adds one ball until you reach 100 =
    // win! (ballNr + (int)(score * 0.1) -> ballNr increases by one
    // every 10:th score
    for (int i = 0; i < ballNr + (int) (score * 0.1); i++) {
        // Score can't be higher than 100
        if (score < 100) {
            g.setColor(ball[i].getCol());
            g.fillOval(ball[i].getXLoc(), ball[i].getYLoc(),
                    ball[i].getSize(), ball[i].getSize());
        }
    }

    // Draw the score and the comment
    g.setColor(Color.black);
    g.setFont(new Font("Arial", Font.BOLD, 24));
    g.drawString("SCORE: " + score, 440, 40);

    g.setColor(Color.red);
    g.setFont(new Font("Arial", Font.BOLD + Font.ITALIC, 28));
    g.drawString(comment, 0, 40);

}

// ACTIONLISTENER //
public void actionPerformed(ActionEvent e) {

    if (e.getSource() == start) {
        tm.start();
        this.requestFocusInWindow(); // Make the runner component have focus
    }

    // Every 10:th score, the game adds one ball until you reach 100 =
    // win! (ballNr + (int)(score * 0.1) -> ballNr increases by one
    // every 10:th score
    for (int i = 0; i < ballNr + (int) (score * 0.1); i++) {
        // Score can't pass 100, because then you have won the game
        if (score < 100) {
            ball[i].setYLoc(ball[i].getYLoc() + ball[i].getVel());
        }
    }

    // If any ball is out of bounds (then the score increases by one)
    for (int i = 0; i < n; i++) {
        if (outOfBounds(ball[i])) {
            ball[i] = new Ball();
        }
    }
    repaint();
}

// If the ball is out of the screen
public boolean outOfBounds(Ball ball) {
    if (ball.getYLoc() >= 500) {
        score++;
        return true;
    } else {
        return false;
    }
}

// Updates new balls
public void updateBalls() {
    for (int i = 0; i < n; i++) {
        ball[i] = new Ball();
    }
}
}
import java.awt.Color;
import java.util.Random;

public class Ball {
// Private variables
private Random r; // Generating random positions and
                    // sizes;
private int size; // Size of the ball
private int vel; // Ball velocity
private int nrOfCol; // Color code (see ballColor-method)
private Color col;
private int xLoc;
private int yLoc;

// Constructor
public Ball() {
    r = new Random();
    size = r.nextInt(40) + 10; // 10px - 50 px
    vel = r.nextInt(6) + 1; // Speed btw 1-5 px/delay
    nrOfCol = r.nextInt(8) + 1; // Specific nr from 1-9
    col = ballColor();
    xLoc = r.nextInt(550);
    yLoc = 0;}

public Ball(int xPos, int yPos, int size, int vel, Color col) {
    this.xLoc = xPos;
    this.yLoc = yPos;
    this.size = size;
    this.vel = vel;
    this.col = col;
}

// A method to generate different colors of the balls
public Color ballColor() {
    Color col;
    switch (nrOfCol) {
    case 1:
        col = Color.black;
        break;
    case 2:
        col = Color.red;
        break;
    case 3:
        col = Color.green;
        break;
    case 4:
        col = Color.yellow;
        break;
    case 5:
        col = Color.pink;
        break;
    case 6:
        col = Color.magenta;
        break;
    case 7:
        col = Color.white;
        break;
    case 8:
        col = Color.orange;
        break;
    case 9:
        col = Color.blue;
        break;
    default:
        col = Color.black;
        // All colors except cyan as it is the background color
    }
    return col;
}

// Getters & setters

public int getXLoc() {
    return xLoc;
}

public int getYLoc() {
    return yLoc;
}

public void setYLoc(int y) {
    yLoc = y;
}

public int getSize() {
    return size;
}

public int getVel() {
    return vel;
}

public Color getCol() {
    return col;
}
}