2014-07-14 3 views
0

나는 인생 시뮬레이션 게임을 만들기 위해 배경 이미지를 JFrame에 페인트하려고합니다. 이것은 내 코드입니다.생성시 JFrame을 페인트하는 방법은 무엇입니까?

public class MainFrame extends JFrame { 
//creates image variables 
Image background; 

public MainFrame(int w, int h) { 
    //creates new JFrame and sets some other properties 
    super("Life Simulation"); 
    setLayout(new FlowLayout()); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(new Dimension(w,h)); 
    //creates images 
    background = Toolkit.getDefaultToolkit().createImage("img/default.jpg"); 
    this.repaint(); 
    setVisible(true); 
} 
@Override 
public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g.drawImage(background,0,0,null); 
    } 
} 

표시하기 전에 설정을 다시 채려고했지만 아무 것도 표시하지 않았습니다. 내 메인 메서드에서 내 프로그램을 시작할 때 JFrame 단순히 비어 있습니다. 그러나 가장 작은 크기로 조정하면 페인트 메서드가 호출되고 배경 이미지가 그려집니다.

이 내 주요 방법입니다 :

public class Main { 

public static void main(String[] args) { 
    MainFrame frame = new MainFrame(1080,720); 
    frame.repaint(); //tried invoking paint() here as well but again to no avail 
} 

}

편집 : 나는 그것은 또한 사전에 페인트() 또는 그 변종 중 하나를 사용하여 내가 경험이 거의 가지고 언급 할 가치가있다 생각, 그것이 어떻게 구현되어야하는지와 그 능력에 대한 지식 만이 있어야한다.

+1

시도 재정의'대신'paint'의 paintComponent'. 무슨 일이 일어나는지 알려줘. – csmckelvey

+0

두 번째 대답을보십시오. 도움이되는지 확인하십시오. http://stackoverflow.com/questions/1097366/java-swing-revalidate-vs-repaint – imtheman

+0

@Takendarkk는'paintComponent' 이러한 메소드를 오버라이드 (override) 할 때 내가 오류에 따라, JFrame' '에 대한 정의되지 않은 방법이다. 그리고 @imtheman, 어떤 구성 요소도 제거하지 않기 때문에 그 결과는 도움이되지 않습니다. – Overclocked

답변

2

오, drawImage 메서드를 호출 할 때 적절한 ImageObserver 개체를 제공하는 것이 중요하다는 것을 강조하고 싶습니다. 대신 null을 통과, 나는 this을 전달하는 것이 좋습니다 것 : Toolkit.createImage를 통해 비동기 적 이미지를로드 할 때

g.drawImage(background, 0, 0, this); 

당신은 importance of specifying an ImageObserver에 대해 읽을 수 있습니다. 이외에도

:paintComponent하지만은 내가 JFrame의의 paint 메서드를 재정의 피하는 것이 좋습니다, JFrame의를위한 것입니다 정의되어 있지 않습니다. 대신 재사용 가능한 ImagePanel 클래스를 만들거나 익명 클래스를 사용하여 JFrame의 콘텐츠 창을 설정할 수 있습니다.

class ImagePanel extends JPanel { 
    private Image image; 

    public ImagePanel(Image image) { 
     this.image = image; 
    } 

    @Override protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, this); 
    } 
} 

또는 익명 클래스를 선호하는 경우 :

은 여기 ImagePanel 클래스의 예

setContentPane(new JPanel() { 
    @Override protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, this); 
    } 
}); 
+0

내가 직접 JFrame의에 이미지를 그릴 수없는 경우 나뿐만 아니라 백업 옵션으로 이것에 대해 생각하고 있었다 오히려 새로운 해요 미안 해요. 좋은 소식은 그림이 자동으로 발생하지만, 전체 이미지가 만 픽셀, 페인트 없다는 것입니다. 어떤 아이디어? – Overclocked

+0

이미지는'Toolkit.createImage'를 사용하여 비동기 적으로로드됩니다. 이미지가 끝까지로드되지 않았을 가능성이 큽니다. 당신은 지정 봤어'당신'paint' 방법'g.drawImage'에 전화에'null' 대신 this'? 또는'ImageIO.read'와 동 기적으로 이미지를로드 할 수 있습니다. – sgbj

+0

네, null''대신'this'로 변경했다.사실, 이것은 paintComponent가 처음부터 자동으로 호출되는 이유입니다. 이전에는 원래의 문제로 계속 실행되었습니다. – Overclocked