创建要绘制的自定义方法 - Graphics 2D g2为null

时间:2013-11-24 03:10:21

标签: java swing graphics null drawing

我正在尝试解决以下问题:编写一个显示奥运五环的程序。为奥运会颜色的戒指着色。提供绘制给定位置和颜色的环的drawRing方法。


我在理解图形类型的对象是如何工作时遇到了一个重大问题。我最初尝试使用getGraphics()将其作为参数传递给方法但是我知道通常可以避免使用此方法,因为可能会发生空异常。所以我读到你应该覆盖组件类中的paintComponent方法?所以我通过创建一个包含覆盖和我的drawRing方法的类来尝试这个,使Graphics2D g2成为一个实例变量,但是一旦在drawRing的第一行调用它,我仍然会得到一个空错误。我一直试图找出几个小时的东西,但我真的不知道如何解决这个问题,使方法可以访问main中的框架,如果有一个完全不同的方式我应该解决它。非常感谢任何帮助。


另外,我想要注意的是,我还没有开始考虑我的drawRing方法中的x和y坐标以及颜色,我首先要确保程序可以访问该方法并且它可以先在主要框架上绘制,之后我会认为这些细节会相当简单。


我的代码:

import javax.swing.*;
import java.awt.*;
import java.applet.*;
import java.awt.geom.*;
public class test{
    public static class ringComponent extends JComponent{
        private Graphics2D g2;
        public void paintComponent(Graphics g){
            g2 = (Graphics2D) g;
        }
        public void drawRing(){
            g2.setColor(Color.RED);//Null error here
            Ellipse2D.Double circle = new Ellipse2D.Double(50, 50, 200, 200);
            g2.draw(circle);
        }
    }
    public static void main(String[] args){
        JFrame frame = new JFrame();
        final int FRAME_WIDTH = 800;
        final int FRAME_HEIGHT = 800;
        frame.setSize(FRAME_WIDTH,FRAME_HEIGHT);
        frame.setTitle("Olympic Rings");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ringComponent rc = new ringComponent();
        rc.drawRing();
        frame.add(rc);
        frame.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:2)

您不应该定义“g2”变量。

你不应该调用drawRing()方法。

而应将drawRing()方法中的代码放在paintComponent()方法中。然后,当需要重新绘制组件时,Swing将自动调用paintComponent()方法。

阅读Custom Painting上Swing教程中的部分,了解更多信息和工作示例。

答案 1 :(得分:1)

当然g2为空。您尚未调用paintComponent,因此尚未初始化。