【问题标题】:How does the Graphics Class in Java work?Java 中的图形类是如何工作的?
【发布时间】:2012-08-02 03:25:45
【问题描述】:

最近,我一直在尝试用图形来做一些 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,你是我唯一的希望。

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

【问题讨论】:

  • 你怎么知道paintComponent() 是在没有参数的情况下被调用的?
  • 嗯,Graphics 代表图形上下文。我不太确定你在说什么,因为显然paintComponent 不是静态方法......它被JComponent.paintComponent 覆盖。它不接受空参数 AFAIK。传入的Graphics 由底层 AWT 代码创建。
  • new line() 创建line 类的实例。因此paintComponent 不是从静态引用中调用的。
  • 花点时间阅读oracle.com/technetwork/java/painting-140037.html 它应该可以帮助您理解您的一些问题...另外,请确保您致电super.paintComponent(g) ;)

标签: java swing graphics paintcomponent


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

  2. 它不接受空参数。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您必须知道的是,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.
         }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        相关资源
        最近更新 更多