最近,我一直在尝试用图形做一些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对象作为参数。当它被调用时,尽管它没有参数。为什么这不会产生错误?我运行了一些测试,在一个需要Integer对象的方法中传递了一个String,然后什么都不传递。我在两个程序上都有错误。
因此,以某种方式创建了一个名为g的图形对象,并使用了drawing方法。但图形是抽象的。
好的,下面是我的问题:
为什么paintComponent的类行在paintComponent不是静态的情况下被调用时会被自动调用?
为什么paintComponent需要Graphics对象时却接受空参数?
Graphics对象g是如何生成的,因为Graphics类是抽象的,不能实例化?
帮帮我Stack Overflow,你是我唯一的希望。
编辑:好吧,我觉得这个问题回答得很好,谢谢!
-
当AWT决定是时候绘制窗口时,会调用paintComponent(在大多数情况下,因为操作系统会向它发送一条消息,告诉它这样做)。当它绘制JFrame时,它遍历其中的对象树。其中是您的行实例,因为您使用jf.add(new line())调用添加了它。在其中的每一个上,都会调用paintComponent方法。
-
它不接受空参数。
-
当AWT调用paintComponent时,它传递一个从Graphics继承的具体类的实例。
签名paintComponent(Graphics g)并没有说参数应该是Graphics类型。但实际上它应该是Graphics类型或继承自Graphics的任何类。另一种看待它的方法是说,从Graphics继承的任何类也是Graphics类型。
在小程序内的屏幕上绘制线条、形状、字符和图像。Java中的大多数图形操作都是在graphics类中定义的方法。你不必为了在小程序中绘制一些东西而创建Graphics的实例;在小程序的paint()方法中,您将获得一个Graphics对象。通过在该对象上绘制,您可以在小程序上绘制,结果将显示在屏幕上。Graphics类是java.awt包的一部分,因此,如果您的小程序进行任何绘制(通常如此),请确保在java文件的开头导入该类。。。。。。。。。。。。。。
您必须知道的是,paintComponent()只由AWT调用,而不是您第一次调用。但是,您可以使用"paint()"方法,因为它在内部调用paintComponent()来更新图形。图形对象也是由Graphics的内部子类创建的。因此,在调用paintComponent()之前,AWT创建扩展Graphics的类的对象(假定g)。之后,AWT通过传递"g"对象来调用您定义的paintComponent()。
这与actionPerformed()在侦听器上使用的方法相同。你只是定义了它,但实际上你不知道它在哪里被调用。实际上,这些都是由JVM(Java虚拟机)执行的任务:
jbutton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//Do sth on button click.
}
});