我想解决以下问题:编写一个显示奥运五环的程序。用奥林匹克颜色对环进行着色。提供一种绘制给定位置和颜色的环的方法。创建自定义方法绘制 - 图形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);
}
}
这实际上是我学会绘制的方式,但这样做我不能做一个单独的方法,可以采取坐标和字符串作为参数,这是我的问题的来源,因为我不能改变paintComponent的参数。 – Reddy
'我不能做一个单独的方法,可以坐标和字符串作为参数' - 确定你可以。您可以将任何方法添加到您想要自定义绘画的课程中。这就是Swing组件的工作原理。诸如setText(),setForeground(),setBackground()之类的方法都会影响组件的绘制方式。如果你有特殊的绘画要求,那么你可以创建适当的“setter”方法,让你改变这些值。然后在setter方法中调用'repaint()',组件将重新绘制自己。 – camickr
所以,如果有可能在课堂上做出我自己的方法,我会如何去做呢?如果我在paintComponent方法中声明了方法,我得到了表达式错误的非法开始,并且在外面声明它正是我在上面尝试的那个方法不起作用。 – Reddy