代码之家  ›  专栏  ›  技术社区  ›  Jan Bodnar

有必要在JPanel上调用setDoubleBuffered吗?

  •  0
  • Jan Bodnar  · 技术社区  · 7 年前

    Java教程说在许多组件中默认启用了双缓冲。

    Swing在它的许多组件中使用这种技术,通常在默认情况下使用setDoubleBuffered方法启用。

    这个 isDoubleBuffered 对于一个 JPanel 那么打电话是多余的吗 setDoubleBuffered(true) 在一个棋盘是 ? (需要减少闪烁和更平滑的动画。)

    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 回复  |  直到 7 年前
        1
  •  1
  •   Krzysztof Cichocki    7 年前

    isDoubleBuffered 在中默认启用 JPanel . 你不必再叫它了。如果您的绘制代码编写正确并使用适当的事件调用,那么一切都应该正常。通常你需要重写 paintComponent 并处理javaswing类的所有绘图。然后你需要打电话请求刷新 repaint() . 这就是全部。为了能够帮助你更多,我需要看到你的绘画代码,所以请包括在这个问题,如果你需要额外的帮助。我不知道isFocusable和setFocusable有什么问题,你能提供一个例子来说明这样的问题吗?