谁在我的类中调用paintComponent()方法?

时间:2011-09-14 18:15:02

标签: java swing

我有一个简单的类,用于在JPanel中绘制图形。这是我的班级:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;

class Drawing_panel extends JPanel {
    public void paintComponent(Graphics g) {
    super.paintComponent(g);       
    this.setBackground(Color.white);
    g.setColor(Color.red);
    g.fillRect(150, 80, 20, 20);
}  

public Dimension getPreferredSize(){
    return new Dimension(500,500);
}

}

我有另一个实例化这个的类:

Drawing_panel dp = new Drawing_panel();

Drawing_panel类中没有构造函数和/或没有显式调用paintComponent()getPreferredSize()方法。我假设在父JPanel构造函数中调用了该方法,但我也没有看到调用。

2 个答案:

答案 0 :(得分:6)

paintComponent来自几个不同的地方。来自JComponent.paint的电话可能是您正在寻找的电话。

请注意paintComponent 未从任何构造函数调用。 paintComponent被称为“按需”,即当系统决定需要重新绘制该组件时。 (例如,可以在调整组件大小时,或者从最小化状态恢复窗口时。)要清楚:组件不是“涂漆,然后使用”,它是“使用,然后在需要时涂漆”。 / p>

这整个绘画调用链都不是你应该打扰的,因为它完全由Swing和所谓的Event Dispatch Thread完成。

答案 1 :(得分:3)

当您将JComponent或JPanel子类化为绘制图形时,请覆盖paintComponent()方法。调用此方法是因为用户使用需要重绘的用户界面执行了某些操作,或者您的代码已明确请求重绘它。     当它变得可见时自动调用     当窗口变得可见(未覆盖或最小化)或调整大小时,“系统”会自动为必须重新绘制的屏幕的所有区域调用paintComponent()方法。