2013-11-24 3 views
1

다음 문제를 해결하려고합니다. 올림픽 링을 표시하는 프로그램을 작성하십시오. 올림픽 색상의 반지를 색칠하십시오. 주어진 위치와 색상의 링을 그리는 메소드 drawRing을 제공하십시오.그리는 사용자 정의 메서드 만들기 - 그래픽 2D g2가 null


나는 내 이해의 주요 문제를 겪고 방법을 정확하게 타입의 그래픽 작업의 대상. 처음에는 getGraphics()을 사용하여 메서드에 매개 변수로 전달했지만 null 예외가 발생할 가능성이 있으므로이 메서드는 일반적으로 피하는 방법을 배웠습니다. 그래서 당신은 구성 요소 클래스에서 paintComponent 메서드를 재정의해야한다는 것을 알았습니까? 그래서 내가 오버라이드 및 내 drawRing 메서드를 포함하는 클래스를 만들어이 시도했다 그러나 Graphics2D g2 인스턴스 변수를 만들었지 만 나는 한 번 후에 그것은 drawRing 첫 번째 줄에서 호출 된 Null 오류가 점점. 나는 몇 시간 동안 무언가를 알아 내려고 노력해 왔지만,이 문제를 접근하여 메인에있는 프레임에 접근 할 수있는 방법을 확실히 알지 못했다. 어떤 도움이라도 대단히 감사합니다.


또한, 난 그냥 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의 스윙 튜토리얼 섹션을 참조하십시오.

+0

실제로이 방법을 사용하여 그리는 방법을 배웠지 만, paintComponent의 매개 변수를 변경할 수 없기 때문에 처음부터 내 문제의 원인 인 매개 변수로 좌표와 문자열을 취할 수있는 별도의 메서드를 만들 수 없습니다. – Reddy

+0

'좌표와 문자열을 매개 변수로 취할 수있는 별도의 메서드를 만들 수 없습니다. '- 할 수 있습니다. 페인팅을 사용자 정의하려는 모든 메소드를 클래스에 추가 할 수 있습니다. 그것이 스윙 구성 요소가 작동하는 방법입니다. setText(), setForeground(), setBackground()와 같은 메서드는 모두 구성 요소가 그려지는 방식에 영향을줍니다. 특별한 페인팅 요구 사항이있는 경우이 값을 변경할 수있는 적절한 "setter"메서드를 만듭니다. 그런 다음 setter 메서드에서'repaint()'를 호출하면 구성 요소가 다시 그려집니다. – camickr

+0

그래서 클래스 내에서 직접 메서드를 만들 수 있다면 어떻게 그렇게 할 것입니까? 내가 paintComponent 메서드 내에서 메서드를 선언하면 표현식 오류가 잘못 시작되고 바깥 쪽을 선언하면 정확히 무엇이 작동하지 않았던 지 알 수 있습니다. – Reddy

1

g2은 null입니다. paintComponent을 호출하지 않았으므로 아직 초기화되지 않았습니다.

+0

나는 paintComponent를 다음 줄과 함께 호출 해 보았습니다. rc.paintComponent (frame.getGraphics()); rc.drawRing(); 하지만 그것도 같은 null 오류. – Reddy