【发布时间】: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 方法。但图形是抽象的。
好的,这是我的问题:
为什么在paintComponent不是静态的情况下调用它的类行时会自动调用paintComponent?
为什么paintComponent 需要Graphics 对象时接受空参数?
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