2013-03-26 2 views
2

그래서 JLayeredPane (실제로는 JLayeredPane을 실제로 서브 클래 싱하는 클래스)을 가지고 있습니다. 그것에 JPanel입니다. Jpanel에 BufferedImage를 추가하고 싶습니다.JLayerPane의 JPanel에 BufferedImage 추가하기

public class BigMap extends JLayeredPane implements MouseListener 
    JPanel mapPanel; 
    BufferedImage theMap; 
    public BigMap (BufferedImage m){ 
    theMap = m; 
    mapPanel = new JPanel(); 
    add(mapPanel, 0); 
    mapPanel.setBounds(0, 0, 640, 640); 
    //other unimportant stuff 
    } 

    @Overrride 
    public void paintComponent (Graphics g){ 
    super.paintComponent(g); 
    Graphics2D gmap = (Graphics2D) mapPanel.getGraphics(); 
    gmap.drawImage(theMap, null, 0, 0); 
    //some other stuff which is working just fine 
    } 

문제점은 BufferedImage가 표시되지 않는 것입니다. JPanel은 backgroundColour를 설정하고 원하는 경우 볼 수 있으므로 확실히 존재합니다. JLayeredPane에 레이아웃 관리자가없고 JPanel의 경계를 설정해야한다는 것을 알았지 만 JPanel 자체의 문제는 아닙니다. BufferedImage가 크기를 직접 제어 할 수있는 방법이 없다는 점을 감안할 때 필자는 그 크기를 어떻게 극복 할 수 있는지 보지 못했습니다.

도움을 주시면 감사하겠습니다.

+0

'mapPanel.getGraphics()'이미 메소드 매개 변수의'Graphics g'을 가지고있는 동안 다른'Graphics' 객체를 얻으려고합니까? 어쨌든 검색 한 그래픽이 유효하지 않은 것 같습니다. 일반적으로, 컴퍼넌트의 getGraphics는 사용하지 말아주세요. –

+0

JLayeredPane에 자신의 이미지가있는 다른 JPanel을 갖기 때문에 간단합니다. 이것은 각자의 내용을 책임지고있는 각 패널의 그래픽을 깔끔하게 유지하려는 시도였습니다. 나쁜 연습? – MrB

+0

_Panel은 자체 컨텐츠에 대한 책임이 있습니다. 나쁜 연습 _ 아니요,하지만 이것은 코드가'paint/paintComponent'를 호출하기 전에 이루어집니다. 그래픽을 돌볼 필요가 없으므로 Swing이 적절한 시간에 적절한 그래픽을 제공합니다. 어떤 Component에 대해서도'getGraphics'를 호출하지 말고 그냥 잘해야합니다. –

답변

2

여기서 문제는 JPanel이 아니라 계층화 된 창의 paintComponent() 메서드를 재정의한다는 것입니다. JPanel은 계층 패널의 자식 중 하나로 나중에 자체적으로 칠하기 때문에 페인트 한 것을 제거합니다.

일반적으로 paintComponent() 메서드는 다른 구성 요소의 그래픽이 아닌 Graphics에 그려야합니다.

+0

아, 나는 그것을 몰랐다. 나는 자습서로 돌아 간다. 정말로 감사하고 받아 들였고 upvoted. – MrB

+0

답변에 따라 변경된 사항을 완벽하게 지원합니다. 다시 감사합니다. – MrB