Java:覆盖paint()和paintComponent()

时间:2015-10-25 00:04:04

标签: java graphics paint paintcomponent repaint

java新手:我覆盖了paint()并在其中添加了一些东西;然后我覆盖了paintComponent(),我注意到paint()中的代码没有被运行。我忘记做某事还是我只是无知? (我知道使用@override是一种很好的做法,但这是其中的一天)

private Image dbImage;
private Graphics dbg;

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

    g.fillOval(0, 0, 10, 12);
}
public void paintComponent(Graphics g) {
    setBackground(Color.CYAN);

    double i = .25;
    if (du) {
        y -= i;
    }
    if (dr) {
        x += i;
    }
    if (dd) {
        y += i;
    }
    if (dl) {
        x -= i;
    }

    if (x < 0) {
        x = 0;
    }
    if (x > getWidth() - 25) {
        x = getWidth() - 25;
    }
    if (y < 25) {
        y = 25;
    }
    if (y > getHeight() - 25) {
        y = getHeight() - 25;
    }

    g.drawOval( (int) x, (int) y, 25, 25);
    repaint();

}
public static void main(String[] args) {


}

关于一个不相关的话题:repaint()做了什么?

1 个答案:

答案 0 :(得分:2)

不要覆盖paint(),也不要直接调用绘制方法。 Swing绘画机制将确保适当的绘画方法在适当的时候进行。

通过覆盖JPanel(或JComponent)的paintComonent(...)来完成自定义绘制。然后将面板添加到框架中。

阅读Swing教程中的部分以获取更多信息和工作示例。

  

repaint()做什么?

它安排重新绘制组件。 RepaintManager会将重绘请求合并到一个绘制请求中,以提高绘画效率。

你永远不应该在绘画方法中调用repaint()。更改类的属性时,可以在setter方法中调用repaint()。例如,使用setForeground()等方法,setBackground()会导致组件的重绘()。

  

java新手:

我建议您保留一个Swing教程的链接,以便学习Swing基础知识。