Java教程说,默认情况下,许多组件中都启用了双缓冲。
Swing在其许多组件中都使用了此技术,通常使用setDoubleBuffered方法默认启用此功能。
isDoubleBuffered
对JPanel
返回true。
那么在棋盘是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");
...
}
}
答案 0 :(得分:1)
isDoubleBuffered
中默认启用了 JPanel
。您无需再次调用它。如果您的绘画代码正确编写并使用适当的事件调用,那么一切都很好。通常,您需要重写paintComponent
并在那里处理Java swing类的所有图形。然后,要刷新请求,您需要致电repaint()
。就这样。为了能够为您提供更多帮助,我需要查看您的绘画代码,因此,如果您需要其他帮助,请将其包括在此问题中。我不知道isFocusable和setFocusable的任何问题,您能提供显示此类行为的任何代码示例吗?