如何在Java中初始化一个Graphics对象?

4

这是代码:

import java.awt.*;
import java.applet.*;

public class anim1 extends Applet{

    public void paint (Graphics g)
    {
        g.drawString("",400,300);
    }

    public static void main(String ad[])
    {
        anim1 a=new anim1();
        Graphics g1;
        a.paint(g1);
    }
}

它说g1没有被初始化。但是我该如何初始化一个抽象类?
7个回答

16

好的,这里有两个问题 1:

    Graphics g1;
    a.paint(g1);

你遇到了一个G1未初始化的错误。那是因为g1变量从未被设置,这导致编译错误。要使代码能够编译,至少需要做到这一点:

    Graphics g1 = null;
    a.paint(g1);

然而,显然这并不能对你有太大帮助。当你尝试运行代码时,你会得到一个NullPointerException。为了真正让你的图形绘制出来,你需要这样做:

    anim1 a=new anim1();
    Graphics g1 = anim1.getGraphics();
    a.paint(g1);

然而,仍然不会生效,因为Anim1不会出现在屏幕上。 为了让其出现在屏幕上,您需要像这样做:

import java.awt.*;
import javax.swing.*;
import java.applet.*;

public class So1 extends Applet{

    public void paint (Graphics g)
    {
        g.drawString("hello",40,30);
    }

    public static void main(String ad[])
    {

        JFrame jp1 = new JFrame();
        So1 a=new So1 ();
        jp1.getContentPane().add(a, BorderLayout.CENTER);
        jp1.setSize(new Dimension(500,500));
        jp1.setVisible(true);

    }
}

注意,我们实际上不自己调用paint()函数。这由awt处理,它实际上选择图形上下文,并为我们调用我们的paint函数。但是,如果您愿意,您可以传递任何您想要的图形对象并要求它绘制到该对象上。(因此,如果您想将组件绘制到图像上,您可以这样做)

(请注意,我已将类名从anim1更改为So1)


1
你所需要做的就是简单地删除主方法,像这样:
import java.awt.*;
import java.applet.*;

public class anim1 extends Applet {

    public void paint (Graphics g) {
        g.drawString("Hello",100,100);
    }
}

1
为了让显示刷新,您需要在anim1对象的实例上调用repaint()方法。 - rustybeanstalk

1
一个小程序不需要像常规的Java应用程序一样有一个主方法。我建议从Sun的Applets教程开始学习。特别是你可能想跳到小程序的生命周期部分,看看在小程序中如何处理图形对象。

0

在paint方法中,您应该操作组件的图形并调用repaint()或update(),而不是直接操作paint方法。

请从这里开始获取更多信息。


0

不要调用paint(Graphics g)方法,而是需要调用repaint或update方法。但是为此,您的类必须属于java.awt.Container层次结构。

对于您的类,您已经重写了Paint方法,在主函数中尝试调用paint方法。不要调用paint方法,而是需要调用repaint或update方法(如果您的类在java.awt.Container层次结构中),Java的事件分派系统会自动调用您重写的paint方法。


0

你没有初始化一个 Graphics 对象。

你可以通过组件的 Component#getGraphics() 方法获取 Graphics 对象。

在你的特定情况下,我认为你只需要 repaint() 方法就可以了!


0
你不需要初始化,可以使用getGraphics函数。但如果你真的想要初始化,可以输入new Graphics(){}; 然后根据需要实现所有抽象方法。大多数情况下,在paint(g)中放置代码就可以了。需要记住将你的小程序设置为可见的,并且通常应该是在你的构造函数中的最后一行甚至之外,我曾经犯过一个错误,当时我先让它可见,然后初始化了一堆变量,结果屏幕一片黑色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接