2010-04-07 3 views
0

커스텀 JLayeredPane을 사용하고 있습니다. JLayeredPane의 여러 레이어에 그려야하는 여러 도형이 있습니다.드로잉 할 때 자바 스윙 NullPointerException이 발생했습니다.

이것을 테스트하려면 JPanel을 만들고 그래픽을 요청하십시오. 그런 다음 JPanel (그래픽 준비)에 테스트 사각형을 그립니다. JLayeredPane의 paintComponent 메소드에서 마침내 모든 것을 그립니다. 그러나 이것은 실패합니다 (NullPointerException).

public class MyCustomPanel extends JLayeredPane { 

// test 
JPanel testpane; 
Graphics g2; 
// test 

// constructor 
public MyCustomPanel() { 
    testpane = new JPanel(); 
    this.add(testpane, new Integer(14)); 
    g2 = testpane.getGraphics(); 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    g2.drawRect(10, 10, 300, 300); 
} 

}

// run: 
//Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
//  at view.MyCustomPanel.paintComponent(MyCustomPanel.java:65) 

이유는 무엇의 JLayeredPane 내에서 이러한 JPanel의에 그릴 수 없습니다? 내 paintComponent 메소드 내에서 직접 JLayeredPane에 그릴 수는 있지만 JLayeredPane의 기본 패널에 있습니다. 내 JLayeredPane에 추가 된 여러 레이어를 만들고 그릴 필요가 있습니다.

내가 뭘 잘못하고 있니? : s

답변

2

당신은 당신에 전달되는 Graphics 캐스팅 g2을 사용해야합니다

Graphics2D g2 = (Graphics2D)g; 

왜 당신이 일을 감하지 않는다?

class InnerPanel extends JPanel 
{ 
    public void paint(Graphics g) 
    { 
    Graphics2D g2 = (Graphics2D)g; 
    g2.drawRect(....); 
    } 
} 

class MyLayered extends JLayeredPane() 
{ 
    MyLayered() 
    { 
    this.add(new InnerPanel(), 14); 
    } 
} 

이 더 의미가 있습니다 .. 또한

당신이 스윙 동작에 동의하지 않는 뭔가를 시도하고 있기 때문이다. 스윙은 디스플레이해야 할 것들 위에 적절한 paint 메쏘드를 호출하는데 신경 쓰고,이 프로토콜을 사용하기 위해서는 스윙이 (paint을 호출하는) 메쏘드를 요청했을 때 무엇을 그릴지를 알려주고 Graphics 메쏘드를 말해야한다. 그것을하고 싶다.

Swing이 여러분의 JLayeredPane을 그릴 때마다 Swing이 적당한 시간에 적절한 방법을 호출 할 것이라는 것을 고려하지 않고 Graphic 개체를 다른 것들로 그립니다.

결론 : 원하는 경우 Graphic 개체에 무언가를 그릴 수 없습니다. 그렇지 않으면 Graphics이이 객체들 중 아무 것도 의미하지 않기 때문에 Swing에 의해 호출 된 메소드 내부에서 수행 할 수 있습니다.

+0

하지만 JLayredPane의 그래픽이 사용되며 내 JPanel은 사용되지 않습니다. 그래서 나는 내 JPanel이 아닌 내 JLayredPane을 그릴 것입니까? : s – juFo

+0

@ 왜 당신은 디커플링을 시도하지 않습니까? 저는 이것을 분리하고 싶지 않습니다. 커스텀 JPanel를 작성하지 않고 JPanel의 JLayredPane 내에서 어떻게 그릴 수 있습니까? : s – juFo

+1

그러면 객체 지향 프로그래밍에 대해 두 번 생각해 봐야합니다. 왜 스스로 외부에 객체의 사용자 지정 그리기를 구현해야합니까? 이것은 말이 안된다. 5 가지 패널로 무엇을 할 것인가? 모든 그래픽 객체를 저장하고 계층화 된 pane의 paintComponent에 그립니다. – Jack

1

변수 g2는 생성자에서 설정 했으므로 null이며, 그리는 경우는 아닐 수 있습니다. 대신 전달 된 "g"를 사용하십시오.

현재 채색중인 구성 요소에서만 정당한 그래픽 만 얻을 수 있습니다. 그렇지 않으면 유효하지 않습니다. 요청한 시점에 MyCustomPanel()이 표시되지 않고 테스트 창도 표시되지 않습니다.

+0

그러나 g는 JPanel이 아닌 JLayeredPane에서 가져옵니다. 그 JFrame에 사각형을 그려야합니다. JFrame의 그래픽이 JLayeredPane의 JFrame이 아닌 JFrame에서 필요합니다 : s – juFo

+0

@jufo, 현재 페인트중인 구성 요소에서만 합법적 인 Graphics를 얻을 수 있습니다. 그렇지 않으면 유효하지 않습니다. 요청한 시점에 MyCustomPanel()이 표시되지 않고 테스트 창도 표시되지 않습니다. –