2014-05-12 2 views
0

그래서 나는 JApplet에를 확장하고 그것의 생성자에서 내가 이후에 상자를 그릴 것하는 JPanel을합니다,하지만 난로 getGraphics를 수행하려고 할 때 null를 돌려 클래스 보드가 :/로 getGraphics 반환 널

JPanel panel; 
public Board(int x, int y, int wolfNumber, int hareNumber){ 
    this.x=x; 
    this.y=y; 

    wolvesCoords = new int[wolfNumber][2]; 
    haresCoords = new int[hareNumber][2]; 

    panel = new JPanel(); 
    panel.setVisible(true); 

    add(panel); 
} 


public synchronized void write(int xx, int yy, Color c){ 
    int width=panel.getWidth()/x; 
    int height=panel.getHeight()/y; 

    Graphics g = panel.getGraphics(); 
    System.out.println(g); 

    g.setColor(c); 

    g.drawRect(xx*width, yy*height, width, height); 
    g.fillRect(xx*width, yy*height, width, height); 


} 

public void paint(Graphics g) 
{ 
     super.paint(g); 
} 

g가 null 일 때 g.setColor (c) 라인에서 nullpointerexception을 제공합니다.

+1

이'write' 메소드는 무엇입니까? 'Graphics' 객체로'paint' 메소드에서 드로잉 코드를 호출하지 않는 이유는 무엇입니까? – durron597

+0

칠판에 도료를 씁니다.g가 null이고 이것이 현재의 문제이기 때문에 저는 페인트를 호출하지 않습니다. – user3369008

+1

아니요,'paint'를 직접 호출하지 마십시오. Java는 자동으로'paint'를 호출 할 것입니다. http://www.oracle.com/technetwork/java/painting-140037.html – durron597

답변

3

Graphics 개체를 잘못 사용하고 있습니다. 호출하는 대신 write을 호출하는 대신 paintComponent을 무시하십시오. 다음과 같이 할 수 있습니다 :

private int xx; 
private int yy; 
private Color c; 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    if(c != null) { 
     int width=panel.getWidth()/x; 
     int height=panel.getHeight()/y; 

     g.setColor(c); 

     g.drawRect(xx*width, yy*height, width, height); 
     g.fillRect(xx*width, yy*height, width, height); 
    } 
} 

public void write(int xx, int yy, Color c) { 
    this.xx = xx; 
    this.yy = yy; 
    this.c = c; 
    repaint(); 
} 
+2

오버라이드에 super의 paintComponent 호출을 추가하는 것을 잊지 마십시오. 그렇지 않으면 귀하의 대답은 1+ 이상입니다. –

+0

나는이 솔루션을 좋아하지만 repaint 메서드를 호출 할 때 painComponent 메서드가 호출되지 않습니다. 왜 그랬을까요? – user3369008

+0

@ user3369008 : 'painComponent'의 철자를 쓰면 호출되지 않습니다. 철자법에주의를 기울여야하고, 메소드의 상단에'@ Override' 주석이 있는지 확인하십시오. 그의 추천과 내 것은 동일하다. 단, 그의 메소드 오버라이드에 수퍼 콜을 추가해야한다. –

3

Yours는 일반적인 문제 및 질문이며 구성 요소에서 getGraphics()을 호출하여 가져온 Graphics 객체를 사용하면 안되는 또 다른 이유입니다. 또 다른 이유는, null 이외의 Graphics 객체 (즉, 이후에 사용할 수있는 )를 얻는 것이 성공하지 못하면 지속되지 않으며 이미지가 있으면 null이 될 수 있습니다 재 페인트가 발생합니다.

대신 자습서에서 권고하는 것을 수행하십시오. JPanel의 paintComponent 메소드에서 제공되는 Graphics 객체로 그립니다. 고정 배경을 그리려면, BufferedImage에서 그렇게하고 BufferedImage를 paintComponent 메소드에 그립니다.


편집
당신은 질문 :

이유는 페인트 방법에 그리기 코드를 호출까요? 메소드 쓰기가 호출 될 때만 그리기가 필요하며 앱이 시작될 때가 아닙니다.

스윙 그래픽이 어떻게 이루어 졌는지는 문제가 이미 발생했기 때문에 스윙 그래픽이 어떻게 이루어 졌기 때문입니다. 다시 말하지만,이 내용을 추측하지 마십시오. 튜토리얼을 읽어보십시오. 튜토리얼은 모두 잘 설명되어 있습니다.


편집 주석의
당신의 상태 : - 방법은 무시하거나 퍼 유형의 메소드를 구현하지 않고 내가 재정의를 추가 할 때

사실이 오류가 표시됩니다. JApplet을 확장 할 수 있습니까?

예, 그렇습니다.

내가

예, 당신이 JApplets을 생산하기 위해 JApplet에를 확장하는 클래스를 가져야하지만, 비록 당신이 사실이 없습니다에이 하지 페인트 직접해야 그들 안에. 대신 JPanel을 확장하는 별도의 클래스를 만들고 해당 클래스의 paintComponent 메서드 내부에 그래픽을 만듭니다. 그런 다음 애플릿에 JPanel을 표시합니다.

+0

그러나 getGraphics를 사용하고 싶습니다. "구성 요소가 렌더링 된 후에"설명 할 수 있습니까? 이 예제에서는 내 패널이 렌더링되지 않습니까? 렌더링하려면 어떻게해야합니까? – user3369008

+1

@ user3369008 : 다시 ** getGraphics()를 사용하지 마라. 스윙 그래픽을 어떻게해야하는지가 아닙니다. 기간. –

+0

@ user3369008 : [이 링크들] (http://stackoverflow.com/tags/swing/info)을 확인하십시오. 비슷한 질문과 답변을 찾으려면이 사이트를 검색하십시오.이 사이트는 여러 번 해시되고 다시 해싱되었습니다. –