Я очень новичок в java.swing, и я смотрел на другие ответы, но я пытаюсь понять, как правильно удвоить буфер для устранения мерцания.
В настоящее время у меня есть класс JFrame, которыйимеет действие Listener
JButton northWest = new JButton("↖");
northWest.setPreferredSize(new Dimension(60, 60));
moveBorder.add(northWest);
northWest.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MainBoardJPanel mainBoardPanel = new MainBoardJPanel();
mainBoardPanel.movePlayer(painel.getGraphics(), -40, -40, playerInfo, currentPlayer.getUsername());
performMove();
}
});
Когда нажата кнопка, метод movePlayer (внутри класса MainBoardJPanel) рисует фон, значок игрока на новом месте и, наконец, еще один слой, который действует как туман войны.
public void movePlayer(Graphics g, int x, int y, PlayerInformation[] playerInfo, String username) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
try {
background = ImageIO.read(new File("Images\\BackgroundBoard.png"));
playerIcon1 = ImageIO.read(new File("Images\\PlayerIcon1.png"));
fogOfWar = ImageIO.read(new File("Images\\FogOfWar.png"));
} catch (Exception e) {
e.printStackTrace();
}
g.drawImage(background, 0, 0, this);
g.drawImage(playerIcon1, playerInfo[0].getPosX(), playerInfo[0].getPosY(), null);
int xFOW = x - 775;
int yFOW = y - 775;
g.drawImage(fogOfWar, xFOW, yFOW, this);
updateUserInfo(x, y, username);
setDoubleBuffered(true);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
(Это очень упрощенная версия для сокращения нерелевантного кода)
Поскольку каждое изображение рисуется последовательно, изображение продолжает мерцать при каждом вызове метода, как бы япойти на двойную буферизацию этого?