В руководстве по Java сказано, что двойная буферизация включена по умолчанию во многих компонентах.
Swing использует эту технику во многих своих компонентах, обычно включаемых по умолчанию с использованием метода setDoubleBuffered.
isDoubleBuffered
возвращает true для JPanel
.
Стоит ли тогда называть setDoubleBuffered(true)
в игре с доской JPanel
? (Необходим для уменьшения мерцания и более плавной анимации.)
Это может быть логичным выводом, но по моему опыту, isFocusable
возвращает true, но нам нужно вызвать setFocusable
несмотря на то, что мы можем обрабатывать ключевые события.
Редактировать
Я добавил несколько фрагментов кода.
private void initBoard() {
...
setDoubleBuffered(true); // Is it necessary?
// isFocusable returns true, but when setFocusable is not called
// key events are not processed
setFocusable(true);
addKeyListener(new TAdapter());
exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(() -> {
doGameCycle();
}, INITIAL_DELAY, PERIOD, TimeUnit.MILLISECONDS);
...
}
private void doGameCycle() {
updateBalloons();
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (isRunning) {
doDrawing(g);
} else {
gameOver(g);
}
Toolkit.getDefaultToolkit().sync();
}
private class TAdapter extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
...
System.out.println("key pressed");
...
}
}