扩展JPanel,继承了什么

时间:2013-07-23 01:20:02

标签: java swing jpanel paintcomponent doublebuffered

所以我创建了一个名为BasePanel的抽象JPanel。在其中我使用双缓冲区代码,如下所示:

public void paint(Graphics g) {
    dbImage = createImage(getWidth(), getHeight());
    dbg = dbImage.getGraphics();
    paintComponent(dbg);
    g.drawImage(dbImage, 0, 0, this);
    repaint();
}

public void paintComponent(Graphics g) {
    g.setColor(Color.BLACK);
}

然后当在另一个面板上扩展它时,我想知道如果我只覆盖paintComponent方法它仍然会加倍缓冲吗?所以我甚至不需要调用paint方法

示例

public class StartScreen extends BasePanel {
    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());

        g.setColor(Color.WHITE);
        g.drawString("Animation Screen", 175, 150);;

        repaint();

    }

}

2 个答案:

答案 0 :(得分:5)

  1. 不要覆盖paint();
  2. 不要在任何绘画方法中调用repaint()。
  3. 不要使用getGraphics()方法,你已经有了Graphics对象
  4. 自定义绘画在paintComponent()方法中完成,不要忘记调用super.paintComponent(...)
  5. 双缓冲自动从父组件继承。

答案 1 :(得分:3)

抱歉,但你的“双缓冲”代码很糟糕。只需覆盖paintComponent即可进行双缓冲。永远不要在paint或paintComponent中调用重绘!除非您想要更改边框和子项的绘制方式,否则不要覆盖绘制。