是否有必要在JPanel上调用setDoubleBuffered?

时间:2018-10-29 07:22:40

标签: java swing

Java教程说,默认情况下,许多组件中都启用了双缓冲。

  

Swing在其许多组件中都使用了此技术,通常使用setDoubleBuffered方法默认启用此功能。

isDoubleBufferedJPanel返回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");
        ...
    }
}

1 个答案:

答案 0 :(得分:1)

isDoubleBuffered中默认启用了

JPanel。您无需再次调用它。如果您的绘画代码正确编写并使用适当的事件调用,那么一切都很好。通常,您需要重写paintComponent并在那里处理Java swing类的所有图形。然后,要刷新请求,您需要致电repaint()。就这样。为了能够为您提供更多帮助,我需要查看您的绘画代码,因此,如果您需要其他帮助,请将其包括在此问题中。我不知道isFocusable和setFocusable的任何问题,您能提供显示此类行为的任何代码示例吗?