我正在尝试解决以下问题:编写一个显示奥运五环的程序。为奥运会颜色的戒指着色。提供绘制给定位置和颜色的环的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);
}
}
答案 0 :(得分:2)
您不应该定义“g2”变量。
你不应该调用drawRing()方法。
而应将drawRing()方法中的代码放在paintComponent()方法中。然后,当需要重新绘制组件时,Swing将自动调用paintComponent()方法。
阅读Custom Painting上Swing教程中的部分,了解更多信息和工作示例。
答案 1 :(得分:1)
当然g2
为空。您尚未调用paintComponent
,因此尚未初始化。