最近,我一直在试图用图形来做一些Java工作。现在Graphics类是抽象的,这意味着它本身不能被实例化,但它的一个子类可能被实例化。那么在下面的代码中发生了什么。 (这并成功创建线)Java中的图形类如何工作?
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);
}
}
现在没事了一些事情没有道理给我。首先,在调用行时,它必须在行类中执行paintComponent方法。这是静态方法的一个属性(用类名称调用)。但paintComponent方法没有静态修饰符。
由于此程序的工作原理,我们必须假设paintComponent确实被调用,并且期望Graphics对象作为参数。当它被调用,虽然它没有参数。为什么这不会产生错误?我跑了一些测试传递一个字符串,然后什么都没有到期待一个Integer对象的方法。我在这两个程序上都有错误。
因此,不知何故,创建了一个名为g的图形对象,并使用了drawline方法。但图形是抽象的。
好了,所以这里是我的问题:
为什么被的paintComponent时自动调用它时的paintComponent不是静态类线叫什么名字?
为什么paintComponent在需要Graphics对象时接受空参数?
Graphics对象g是如何产生的,因为Graphics类是抽象的并且不能被实例化?
帮助我堆栈溢出,你是我唯一的希望。
编辑: 好的,我认为这个问题已经很好的回答了,谢谢!
你怎么知道'paintComponent()'被调用时没有参数? – irrelephant 2012-08-04 06:51:04
那么,[Graphics](http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html)是_graphics context_的代表。我不太清楚你在说什么,很明显'paintComponent'不是一个静态方法......它被[JComponent.paintComponent]覆盖(http://docs.oracle.com/javase/7/文档/ API /使用javax /秋千/ JComponent.html#的paintComponent(java.awt.Graphics))。它不接受空论据AFAIK。传入的'Graphics'是由底层的AWT代码创建的。 – oldrinb 2012-08-04 06:53:22
'new line()'创建'line'类的一个实例。因此'paintComponent'没有被静态引用调用。 – MadProgrammer 2012-08-04 06:53:26