3

最近,我一直在尝试用图形来做一些 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 对象作为参数。当它被调用时,虽然它没有参数。为什么这不会产生错误?我通过传入一个字符串运行了一些测试,然后没有任何东西进入一个期望一个整数对象的方法。我在两个程序上都有错误。

因此,不知何故创建了一个名为 g 的图形对象,并使用了 drawline 方法。但是图形是抽象的。

好的,这是我的问题:

  1. 为什么在paintComponent不是静态的情况下调用它的类行时会自动调用paintComponent?

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

  3. 由于 Graphics 类是抽象的且无法实例化,因此如何制作 Graphics 对象 g?

帮助我 Stack Overflow,你是我唯一的希望。

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

4

3 回答 3

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

  2. 它不接受空参数。

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

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

于 2012-08-04T07:13:49.223 回答
0

您必须知道的是,paintComponent() 仅由 AWT 调用,而不是您第一次调用。但是“repaint()”方法是可以使用的,因为它在内部调用paintComponent() 来更新图形。图形对象也是由 Graphics 的内部子类创建的。所以在调用paintComponent() 之前,AWT 创建扩展Graphics 的类的对象(假设g)。之后,AWT 通过传递“g”对象调用您定义的paintCompoent()。

这与方法 actionPerformed() 对侦听器的作用相同。你只是定义它,但你实际上并不知道它在哪里被调用。实际上,这些是由 JVM(Java 虚拟机)执行的任务:

jbutton.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
      //Do sth on button click.
   }
});
于 2019-10-03T04:35:14.797 回答
0

在小程序内的屏幕上绘制线条、形状、字符和图像。Java 中的大多数图形操作都是在Graphics 类中定义的方法。您不必为了在您的小程序中绘制某些东西而创建 Graphics 的实例;在您的小程序的 paint() 方法中,您将获得一个 Graphics 对象。通过在该对象上绘图,您可以在小程序上绘图,结果会出现在屏幕上。Graphics 类是 java.awt 包的一部分,因此如果您的小程序进行任何绘画(通常会这样),请确保在 Java 文件的开头导入该类............ ...

于 2017-05-02T11:14:46.210 回答