最近,我一直在尝试使用Java图形进行一些工作。现在Graphics类是抽象的,这意味着它本身不能被实例化,但它的子类可能被实例化。那么在下面的代码中发生了什么(成功创建了一条线)。
import javax.swing.*;
import java.awt.*;
public class line extends JPanel {
public void paintComponent(Graphics g) {
g.drawLine(0, 0, 90, 90);
}
public static void main(String[] args) {
JFrame jf = new JFrame();
jf.add(new line());
jf.setSize(500, 500);
jf.setVisible(true);
}
}
现在有几件事情我不太明白。首先,当调用line时,它必须执行line类中的paintComponent方法。这是静态方法的属性(使用类名调用)。但是paintComponent方法没有静态修饰符。
虽然这个程序可以工作,但我们必须假设paintComponent确实被调用,并期望一个Graphics对象作为参数。但是当它被调用时,它没有参数。为什么这不会创建错误?我进行了一些测试,将String和空值传递给一个期望Integer对象的方法。两个程序都出错了。
因此,某种方式创建了一个名为g的图形对象,并使用drawline方法。但是Graphics是抽象的。
好的,这里是我的问题:
为什么paintComponent在其类line被调用时自动调用,而paintComponent不是静态的?
为什么paintComponent接受空参数,而它期望一个Graphics对象?
由于Graphics是抽象的且无法实例化,因此如何制作Graphics对象g?
求助于Stack Overflow,你是我的唯一希望。
编辑:好的,我认为这个问题已经得到了很好的回答,谢谢!
paintComponent()
被调用时没有参数? - irrelephantpaintComponent
不是一个静态方法...它是从JComponent.paintComponent中重写的。据我所知,它不接受空参数。传递进来的Graphics
是由底层的AWT代码创建的。 - obatakunew line()
创建了line
类的一个实例。因此,paintComponent
没有从静态引用中调用。 - MadProgrammer