2012-08-04 47 views
3

最近,我一直在试图用图形来做一些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方法。但图形是抽象的。

好了,所以这里是我的问题:

  1. 为什么被的paintComponent时自动调用它时的paintComponent不是静态类线叫什么名字?

  2. 为什么paintComponent在需要Graphics对象时接受空参数?

  3. Graphics对象g是如何产生的,因为Graphics类是抽象的并且不能被实例化?

帮助我堆栈溢出,你是我唯一的希望。

编辑: 好的,我认为这个问题已经很好的回答了,谢谢!

+0

你怎么知道'paintComponent()'被调用时没有参数? – irrelephant 2012-08-04 06:51:04

+0

那么,[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

+0

'new line()'创建'line'类的一个实例。因此'paintComponent'没有被静态引用调用。 – MadProgrammer 2012-08-04 06:53:26

回答

8
  1. 当AWT决定是绘制窗口的时候(在大多数情况下,因为操作系统发送消息告诉它这样做)paintComponent被调用。当它绘制JFrame时,它会遍历它内部的对象树。其中就是你的实例,因为你用jf.add(new Line())调用添加了它。在每个这些paintComponent方法被调用。

  2. 它不接受空的参数。

  3. 当AWT调用paintComponent时,它传递一个从Graphics继承的具体类的实例。

签名paintComponent(Graphics g)没有太多说参数应该是类型Graphics。但实际上它应该是Graphics类型或从Graphics继承的任何类型。另一种看待它的方式是说,从Graphics继承的任何类都是类型Graphics。

0

将线条,形状,字符和图像绘制到applet中的屏幕上。 Java中的大多数图形操作都是在Graphics class中定义的方法。您不必创建一个Graphics实例来绘制applet中的某些东西;在你的applet的paint()方法中,给你一个Graphics对象。通过绘制该对象,您可以绘制您的小程序,并将结果显示在屏幕上。 Graphics类是java.awt包的一部分,所以如果你的applet做任何绘画(就像它通常那样),确保你在你的Java文件开头导入那个类........... ...