2013-08-31 18 views
0

아래 코드는 애플릿에 삼각형을 표시하는 코드입니다. 그러나 저에게는 적합하지 않습니다. 내가 Graphics g을 사용하는 동안 나는 무엇을하고 있는지 알고 싶다. 나는 자바를 처음 사용하고 일부 온라인 자습서를 배우고있다. 그러니 제 프로그램을 수정하고 제가하고있는 실수를 말해주십시오.graphics2D에서 도형 그리기가 작동하지 않습니다

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.applet.*; 
public class Vehicle extends JFrame { 

    final int WIDTH = 900; 
      int HEIGHT = 650; 


    public void init() { 

     setSize(WIDTH, HEIGHT); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 

    } 
    public void paint(Graphics2D g) { 

Graphics2D g2 = (Graphics2D) g; 
    Dimension d = getSize(); 
    System.out.println(d); 
      int[] yPoints={150,250,250}; 
      int[] xPoints={200,150,250}; 


     g2.setColor(Color.green); 


     g2.drawPolygon(xPoints, yPoints, 3); 
     g2.drawRect(100, 100, 100, 100); 

     g2.setColor(Color.red); 

     g2.fillPolygon(xPoints, yPoints, 3); 
    } 


    public static void main(String[] args) { 
     Vehicle v= new Vehicle(); 
     v.init(); 

    } 

} 

답변

1

있어서 paint(Graphics g)java.awt.Component 정의된다. 이것은 다소간의 레거시 코드입니다. 그러나이 API는 오랫동안 변경되지 않았으며 JFrame과 같은 최신 Swing 구성 요소에 상속됩니다.

당신은 단순히 (paint(Graphics2D g)에 귀하의 경우) 메서드 서명을 변경할 수 없습니다, 당신은 API에 의해 정의 된 서명과 함께 생활해야합니다.

따라서, 귀하의 경우, paint(Graphics2D g)는 API 방식 paint(Graphics g) 오버라이드 (override)하지 않으며, JFrame를 업데이트 할 때 따라서 호출되지 않습니다. 아무것도 그려지지 않습니다.

은 다음과 같이 코드를 변경

:

----------------%<---------------------- 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 

    } 
    public void paint(Graphics g) { // <-- Change from Graphics2D to Graphics 

Graphics2D g2 = (Graphics2D) g; 
    Dimension d = getSize(); 
    System.out.println(d); 
      int[] yPoints={150,250,250}; 
      int[] xPoints={200,150,250}; 

---------------->%---------------------- 
+0

좋아요.하지만 어떻게해야합니까? Jframe 대신 프레임을 사용하면 작동합니까? – Navaneet

+0

아니요, 그냥'paint (Graphics g)'를 사용하십시오. –

1

이 프로그램이 도움을보기 전에 무엇을하고 있는지에 잘보세요. (당신을 꾸짖지 않고 미래를 돕기 위해 노력하는 것입니다.) public void paint(Graphics2D g)이 있습니다. Petersen이 말했듯이 JFrame 클래스의 메소드는 아닙니다. public void paint(Graphics2D g)이 있습니다. 자습서에서 말하는 스윙의 방법이 @Override을 메서드 위에 놓는 지 확인하는 데 사용할 좋은 트릭입니다. 오류가 있으면 메소드가 JFrame 또는 사용자가 소유 한 수퍼 클래스에 있지 않음을 의미합니다. 그렇지 않으면 메소드를 대체합니다. 하하 .. 여기 Graphics2D g2 = (Graphics2D) g; 이 일어날 필요가 없습니다해야 Graphics2D 객체 ... 같은 Graphics2D 개체를 캐스팅하고

당신은 이제 막 시작하는 경우 :

또한, 다른 플래그는 다음 줄 것 스윙과 Graphics2D로 패널 시스템과 다른 저수준의 것들, 예를 들어 drawImage 또는 drawString을 배우는 것이 좋습니다.

+0

고마워. 알았어. 나는 며칠 전 자바를 배우기 시작했다. – Navaneet

+0

귀하의 질문에 만족하는 경우 답변을 합격으로 표시하여 중복 답변을받지 못하게하고 외부 방문자가 필요한 도움을받을 수 있습니다. 기꺼이 도와 드리겠습니다. – snickers10m

+1

'JPanel'에 대한 정보는 [this thread] (http://stackoverflow.com/questions/18545048/java-calling-repaint-from-another-class-jframe)를 확인하십시오. 사용해야합니다. JFrame에서'paint()'를 호출하는 것은 좋은 습관이 아닙니다. 커스텀'JPanel'을'JFrame'에'(Component c)'추가하고'JPanel'의'paintComponent (Graphics g)'메소드에 그래픽 코드를 써야합니다. – snickers10m

0

은 Java2D에 작업 종종 애니메이션 등의 응용 프로그램을 상상하는 데 도움이됩니다. 상상해보십시오. 한 지점에서 특정 프레임 (애니메이션 프레임에 대해 알았습니다.)이 화면에 그려져 있다고 가정 해보십시오. 어떤 이벤트가 발생하면 우리는이 프레임을 만화 또는 애니메이션 영화의 제작 방식과 매우 흡사 한 다른 프레임으로 교체합니다. 우리는 어떻게 애니메이션 프레임을 그립니까? 프레임을 어떻게 전환합니까?

자바 API는 그 구성 요소가 그려 질하기위한 페인트 (그래픽 g) 메소드를 제공한다. 그런 다음 페인트 (Graphics g)를 다시 호출하고 화면에 변경 사항을 표시하는 repaint()라고하는 동일한 구성 요소를 업데이트합니다. 이 API 메소드에는 우리가 따라야 할 엄격한 서명이 있습니다. 페인트입니다 (Graphics g). 그러나 Graphics2D는 그래픽이 너무 오래되어서 (기존의) 더 이상 차가 워진 것이 아니기 때문에 더 많은 기능을 제공하는 멋진 아이와 매우 흡사합니다. 그렇다면 paint (Graphics g)는 Graphics2D가 아닌 Graphics만을 받아들이 기 때문에 어떻게해야할까요? Graphics2D는 Graphics의 서브 클래스입니다. 프로토콜은 간단
,

  1. 는 모든 구성 요소의 기존 페인트 (그래픽 g) 방법을 사용합니다.
  2. 일단 우리는 super를 사용했습니다.(필요한 경우) 페인트 (그래픽 g), 우리는 우리가 기능을 향상 얻을의 Graphics2D 레거시 목적으로 사용 된 그래픽 객체를 캐스트 할 수 있습니다 (당신은 바로이 단계를 수행 한)

문제를 코드와 함께. : 서명 일뿐입니다. Java와 repaint()는 메소드가 paint (Graphics g)가 될 것으로 예상하지만 서명을 변경 했으므로 위의 프로토콜 (또는 계약)이 손상되었습니다. 아이디어는 서명을 변경하지 않고 계약을 유지 한 다음 유형 변환 및 재정의하여 확장 기능을 추가하는 것입니다. 자바는 페인트 (그래픽 g)를 찾을 수 없으므로 repaint()는 페인트 (그래픽 g)도 찾지 않습니다.