2012-05-16 3 views
1

내 프로젝트에 문제가 있습니다./이미지를 그리는 방법에 문제가 있습니까?

왜 drawPac이 제대로 작동하지 않는 이유가 무엇입니까? 검은 색 직사각형이 그림이지만, 내 이미지가 아닙니다 :/왜

JFrame을 확장하는 메인 클래스없이 4 개의 클래스를 만들었습니다. 여기에는 JPanel 게임이 추가되었습니다.

파일 # 1

package pacman; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JPanel; 

public class Game extends JPanel { 

    Pac pacman = new Pac(); 

    public void Game() { 
    setFocusable(true); 
    setBackground(Color.BLACK); 
    setDoubleBuffered(true); 
    } 

@Override 
public void paint(Graphics g){ 
    super.paint(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.setColor(Color.black); 
    g2d.fillRect(0, 0,this.getWidth(),this.getHeight()); 
    drawPac(g2d); 
} 

public void drawPac(Graphics2D g2d){ 
    g2d.drawImage(pacman.image, pacman.x, pacman.y, 100, 100, this); 
    } 
} 

파일 # 2

package pacman; 
import java.awt.Image; 
import javax.swing.ImageIcon; 

public class Actor { 
    int x,y; 
    int dv; 
    Image image; 
    public void Actor(){ 
    } 
} 

파일 # 3

package pacman; 
import pacman.Game; 
import javax.swing.ImageIcon; 
import java.awt.Graphics2D; 

public class Pac extends Actor { 

public void Pac(){ 

    try{ 
    image = new ImageIcon(Pac.class.getResource("../img/Pac00.gif")).getImage(); 
    x=0; 
    y=0; 
     } 
    catch (Exception e){ 
     System.out.println("Blad prz otwieraniu"); 
     System.exit(0); } 
} 

} 
+1

코드를 가지고 있다고 생각 - (코드 블록, 홀수 들여 쓰기 외부의 코드) 잘 포맷되지 않았습니다 - SO에 붙여 넣기한다. 우리가 더 쉽게 읽을 수 있도록 청소하십시오. –

+0

gif 이미지가 올바르게로드 되었습니까? 디버거로 확인하십시오. – Nefron

답변

-1

확인 @lechniak 업데이트 게임 클래스

public class Game extends JPanel { 
Pac pacman = new Pac(); 

public Game() { 
    setFocusable(true); 
    setBackground(Color.BLACK); 
    setDoubleBuffered(true); 
} 
@Override 
public void paint(Graphics g){ 
    super.paint(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.setColor(Color.black); 
    g2d.fillRect(0, 0, this.getWidth(), this.getHeight()); 
    drawPac(g2d); 
} 

public void drawPac(Graphics2D g2d){ 
    g2d.drawImage(pacman.image, pacman.x, pacman.y, 200, 200, this); 
} 

public static void main(String[] args) { 
    JFrame f = new JFrame("Image Draw"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.getContentPane().add(new Game()); 
     f.setSize(350,300); 
     f.setLocation(300,300); 
     f.setVisible(true); 
} 
} 

그리고 팩맨 클래스

//import javax.swing.ImageIcon; 
import java.awt.image.BufferedImage; 
import java.awt.Graphics2D; 
import javax.imageio.ImageIO; 
import java.io.*; 

public class Pac /*extends Actor*/ { 
    int x = 0; 
    int y = 0; 
    BufferedImage image; 

     public Pac() { 
      try { 
      image = ImageIO.read(new File("/Users/hlozano/java/swing/programmerBorn.jpg")); 
      //new ImageIcon(Pac.class.getResource("../img/Pac00.gif")).getImage(); 
      x = 0; 
      y = 0; 
      } catch (Exception e) { 
      System.out.println("Blad prz otwieraniu " + e); 
      System.exit(0); 
       } 
     } 
} 

그리고 이미지 출력

enter image description here

난이 도움이되기를 바랍니다.

+0

하지 마세요! 그렇게하면 "아름다운"무한 재귀가 발생합니다. – davidbuzatto

+0

시도하고 nothnig 나는이 프로젝트를 디버그하고,이 이미지가 pacman.image에로드되지 않는 것 같아요. 쓸 때, System.out.println (팩맨.영상); 로드 한 후 'null'을 반환합니다. 추가로 이미지에 나쁜 경로로 바뀌고 여전히 컴파일되고 분명히 그리지 않습니다. 그러나 왜 그것이 수수께끼를 던지지 않고 컴파일하고 있습니까? 그리고 올바르게 그려야합니까? – lechniak

+0

런타임 예외 (선택되지 않음)이기 때문에. 컴파일러는 외부 리소스가 존재 함을 어떻게 알 수 있습니까? 이것을 시도해보십시오 : 프로젝트 내부 (일부 패키지 내부)에 이미지를 넣고 코드를 다음과 같이 변경하십시오 : image = ImageIO.read (Pac.class.getResourceAsStream ("/ package_path/Pac00.gif")); – davidbuzatto

2

1 - "Pac"클래스가 추첨 자체에 대한 책임을 져야합니다. 그렇지 않습니까?

2 - JPanels 및 모든 JComponent의 아들의 경우, 페인트 작업을 paintComponent, paintBorder 및 paintChildren에 위임 할 책임이있는 paint가 아닌 paintComponent 메소드를 대체해야합니다. 페인트로 작업하는 것처럼 paintComponent의 슈퍼 버전도 호출해야합니다. 문서를보십시오.

3 - 대부분의 경우 원본을 기반으로 한 새로운 그래픽 컨텍스트를 만드는 것이 좋습니다. 그래서, 당신의 라인은 :

Graphics2D g2d = (Graphics2D) g; 

이로 교체해야합니다 :

Graphics2D g2d = (Graphics2D) g.create(); 

그리고 당신은 폐기해야하는 (g2d.dispose())에의 paintComponent의 마지막 줄에 그것을 (사용 후 새로운 컨텍스트).

4 - Pac 클래스의 코드가 맞습니까? 컴파일 중이 야? 이미지 필드는 Actor의 멤버입니까?

나는 당신이 당신의 질문에 보여되지 코드에서 몇 가지 문제가 ...

+0

오류가없는 모든 항목이 컴파일됩니다. – lechniak

+0

오류가없는이 코드 공동 작업자에게 감사드립니다. 페인트를 paintComponent로 변경하면 컴파일시 오류가 발생합니다. thread "AWT-EventQueue-0"java.lang.StackOverflowError? – lechniak

+0

super.paint에 대한 호출을 super.paintComponent로 변경 했습니까? – davidbuzatto

관련 문제