2013-11-24 47 views
1

我想解决以下问题:编写一个显示奥运五环的程序。用奥林匹克颜色对环进行着色。提供一种绘制给定位置和颜色的环的方法。创建自定义方法绘制 - 图形2D g2为空


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


而且,我只是想指出,我还没开始占x和y在我drawRing方法坐标以及颜色,我首先要确保该程序可以访问该方法时,它可以画在主要的首先制作的框架上,之后我将这些细节描绘得相当简单。


我的代码:

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

你不应该定义一个“g2”变量。

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

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

有关更多信息和工作示例,请参阅Custom Painting的Swing教程中的部分。

+0

这实际上是我学会绘制的方式,但这样做我不能做一个单独的方法,可以采取坐标和字符串作为参数,这是我的问题的来源,因为我不能改变paintComponent的参数。 – Reddy

+0

'我不能做一个单独的方法,可以坐标和字符串作为参数' - 确定你可以。您可以将任何方法添加到您想要自定义绘画的课程中。这就是Swing组件的工作原理。诸如setText(),setForeground(),setBackground()之类的方法都会影响组件的绘制方式。如果你有特殊的绘画要求,那么你可以创建适当的“setter”方法,让你改变这些值。然后在setter方法中调用'repaint()',组件将重新绘制自己。 – camickr

+0

所以,如果有可能在课堂上做出我自己的方法,我会如何去做呢?如果我在paintComponent方法中声明了方法,我得到了表达式错误的非法开始,并且在外面声明它正是我在上面尝试的那个方法不起作用。 – Reddy

1

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

+0

我尝试使用以下命令调用paintComponent:rc.paintComponent(frame.getGraphics());就在rc.drawRing()之前;但其相同的空错误。 – Reddy