Java Panel Double Buffering
awt, doublebuffered, java, swing
Solution
There's a really good tutorial here which describes how to use BufferStrategy to produce non-flickering animation.
The important points are:
- Call `setIgnoreRepaint(true)` on the top-level `Canvas` to prevent AWT from repainting it, as you'll typically be doing this yourself within the animation loop.
- Obtain the `Graphics2D` object from the `BufferStrategy` (rather than using the instance passed in via `paintComponent(Graphics g)`.
Problem
wondered if anyone could point me in the right directon, i have developed a pong game and it needs double buffering due to flickering. Iv tryed some of the post on here to try and make it work, but im still a beginner with the swing awt suff, any help would be amazing thanks. ``` public class PongPanel extends JPanel implements Runnable { private int screenWidth = 500; private int screenHeight = 300; private boolean isPaused = false; private boolean isGameOver = false; private int playToPoints = 10; private Padel player1,player2; private Ball ball; private Thread gameThread; private Image dbImage; private Graphics dbg; public PongPanel() { setPreferredSize(new Dimension(screenWidth,screenHeight)); setBackground(Color.BLACK); setDoubleBuffered(true); setFocusable(true); requestFocus(); player1 = new Padel(Position.LEFT,screenWidth,screenHeight); player2 = new Padel(Position.RIGHT,screenWidth,screenHeight); ball = new Ball(10,screenWidth/2,screenHeight/2,Color.WHITE); } public void addNotify(){ super.addNotify(); startGame(); } private void startGame(){ gameThread = new Thread(this); gameThread.start(); } @Override public void run() { while (!isGameOver) { dbImage = createImage(screenWidth,screenHeight); dbg = this.getGraphics(); if(!isPaused){ if(!gameOverCheck()){ updateGame(); paintComponents(dbg); } }else if(isPaused){ dbg.setColor(Color.ORANGE); dbg.setFont(new Font("serif",Font.BOLD,50)); dbg.drawString("Paused", screenWidth/2-82, screenHeight/2); } try { Thread.sleep(30); } catch (InterruptedException e) {e.printStackTrace();} } } private boolean gameOverCheck(){ if(player1.getScore() == playToPoints){ dbg.setColor(player1.getColour()); dbg.setFont(new Font("serif",Font.BOLD,50)); dbg.drawString("Player 1 Wins!", screenWidth/2 - 161, screenHeight/2); setGameOver(true); return true; }else if(player2.getScore() == playToPoints){ dbg.setColor(player2.getColour()); dbg.setFont(new Font("serif",Font.BOLD,50)); dbg.drawString("Player 2 Wins!", screenWidth/2 - 161, screenHeight/2); setGameOver(true); return true; } return false; } private void updateGame(){ ball.move(screenWidth,screenHeight,player1,player2); player1.aiForPadel(screenWidth, screenHeight, ball.getX(), ball.getY()); player2.aiForPadel(screenWidth, screenHeight, ball.getX(), ball.getY()); } @Override public void paintComponents(Graphics g) { super.paintComponents(g); dbg.setColor(Color.BLACK); dbg.fillRect(0, 0, screenWidth+20, screenHeight+20); dbg.setColor(Color.WHITE); dbg.drawLine(screenWidth/2, 0, screenWidth/2, screenHeight); dbg.setFont(new Font("serif",Font.BOLD,32)); dbg.drawString(player1.getScore()+"", screenWidth/2-40, screenHeight - 20); dbg.drawString(player2.getScore()+"", screenWidth/2+20, screenHeight - 20); ball.drawBall(dbg); player1.drawPadel(dbg); player2.drawPadel(dbg); } } ```