我有一个简单的类,用于在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
构造函数中调用了该方法,但我也没有看到调用。
答案 0 :(得分:6)
paintComponent
来自几个不同的地方。来自JComponent.paint
的电话可能是您正在寻找的电话。
请注意paintComponent
未从任何构造函数调用。 paintComponent
被称为“按需”,即当系统决定需要重新绘制该组件时。 (例如,可以在调整组件大小时,或者从最小化状态恢复窗口时。)要清楚:组件不是“涂漆,然后使用”,它是“使用,然后在需要时涂漆”。 / p>
这整个绘画调用链都不是你应该打扰的,因为它完全由Swing和所谓的Event Dispatch Thread完成。
答案 1 :(得分:3)
当您将JComponent或JPanel子类化为绘制图形时,请覆盖paintComponent()方法。调用此方法是因为用户使用需要重绘的用户界面执行了某些操作,或者您的代码已明确请求重绘它。 当它变得可见时自动调用 当窗口变得可见(未覆盖或最小化)或调整大小时,“系统”会自动为必须重新绘制的屏幕的所有区域调用paintComponent()方法。