2015-02-04 4 views
0

자바 그래픽에 대한 나쁜 이해를 가져 와서 죄송합니다.페인트 메서드 내에서 객체 메서드 호출하기 Java

public void paint(Graphics window) 
{ 
    window.setColor(Color.WHITE); 
    window.fillRect(0,0,getWidth(), getHeight()); 
    window.setColor(Color.BLUE); 
    window.drawRect(20,20,getWidth()-40,getHeight()-40); 
    window.setFont(new Font("TAHOMA",Font.BOLD,18)); 
    window.drawString("CREATE YOUR OWN SHAPE!",40,40); 
} 

모든 모든 사각형 최대 보여주는 텍스트, 잘 작동 : 그래서,이 페인트 방법이있다.

는 그럼으로 변경 :

public void paint(Graphics window) 
{ 
    window.setColor(Color.WHITE); 
    window.fillRect(0,0,getWidth(), getHeight()); 
    window.setColor(Color.BLUE); 
    window.drawRect(20,20,getWidth()-40,getHeight()-40); 
    window.setFont(new Font("TAHOMA",Font.BOLD,18)); 
    window.drawString("CREATE YOUR OWN SHAPE!",40,40); 

    sh.setX(sh.getX()+sh.getXSpeed()); 
    sh.setY(sh.getY()+sh.getYSpeed()); 
    sh.draw(window); 

    if(!(sh.getX()>=10 && sh.getX()<=730)) 
     sh.setXSpeed(-sh.getXSpeed()); 

    if(!(sh.getY()>=10 && sh.getY()<=530)) 
     sh.setYSpeed(-sh.getYSpeed()); 
} 

갑자기 아무것도까지 보여줍니다. (이전에 나타난 텍스트조차도 아닙니다.) "sh"는 Shape 클래스의 인스턴스입니다. 호출 된 메소드는 상당히 자명하지만 (Setters 및 getters), 참조 용으로 끝에 포함됩니다.

왜 이런 일이 발생합니까? 나는 또한 그것들을 여기에 올릴 어떤 용도의 것이라면, 수많은 터미널 에러를 얻는다. 내 말은, 나는 setters와 getter가 물건을 사라지게하거나 심각한 오류를 일으키지 않을 것을 기대한다. ("sh.draw (window)"도 제거하면 상황이 사라진다는 것을 명심하자.) paint 메서드 내에서 object 메서드를 호출 할 때 문제가 있습니까? 대신 내가 뭘 할 수 있니?

public int getX() 
     { 
     return xPos; 
     } 

     public int getY() 
     { 
      return yPos; 
      } 

      public int getXSpeed() 
      { 
      return xSpeed; 
      } 

      public int getYSpeed() 
      { 
      return ySpeed; 
      } 

      public void setX(int newX) 
      { 
      xPos=newX; 
      } 

      public void setY(int newY) 
      { 
      yPos=newY; 
      } 

      public void setXSpeed(int newX) 
      { 
      xSpeed=newX; 
      } 

      public void setYSpeed(int newY) 
      { 
      ySpeed=newY; 
      } 

     public void draw(Graphics window) 
     { 
      window.setColor(color); 
      window.fillRect(xPos, yPos, width, height); 
      if(color!=Color.BLUE) 
      window.setColor(Color.BLUE); 
      else 
      window.setColor(Color.RED); 
      int xDev=(width/10); 
      int yDev=(height/10); 
      int xDev2=width/8; 
      int yDev2=height/8; 

      window.fillOval(xPos+xDev, yPos+yDev, width-yDev*2, height-yDev*2); 
      window.setColor(Color.BLACK); 
      window.fillOval(xPos+xDev*2, yPos+yDev*2, width-xDev*4, height-yDev*4); 
      xPos+=width/2; 
      yPos+=height*2/3; 
      int[] treeXPoints = {xPos,xPos-xDev*2,xPos-xDev,xPos+xDev,xPos+xDev*2}; 
      int[] treeYPoints = {yPos,yPos-yDev*2,yPos-yDev*3,yPos-yDev*3,yPos-yDev*2}; 
      Polygon present1 = new Polygon(treeXPoints,treeYPoints,treeXPoints.length); 
      window.setColor(Color.YELLOW); 
      window.fillPolygon(present1); 
      xPos-=width/2; 
      yPos-=height*2/3; 
     } 

터미널 오류 :

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException 
    at MovingShapePanel.paint(MovingShapePanel.java:48) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5219) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1529) 
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1452) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1249) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5167) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4978) 
    at javax.swing.RepaintManager$3.run(RepaintManager.java:808) 
    at javax.swing.RepaintManager$3.run(RepaintManager.java:796) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:769) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:718) 
    at javax.swing.RepaintManager.access$1100(RepaintManager.java:62) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1677) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:694) 
    at java.awt.EventQueue$3.run(EventQueue.java:692) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+0

은 터미널에 인쇄 된 오류를 표시합니다. – dkatzel

+1

"오류의 원인"은 현재 상황을 이해하는 데 도움이되는 정보입니다. 게시 해주세요. – RealSkeptic

+0

사용자 정의 페인팅을 수행하기 전에 super.paint를 호출하십시오. 그렇지 않으면 페인트 공예품의 끝이 없어 질 수 있습니다. – MadProgrammer

답변

1

당신은 당신의 페인트 방법 라인 (48)

I에서 NullPointerException을 받고 코드를 이해하는 데 필요한

참조하는 방법,하지만 귀하의 필드를 sh으로 호출하기 전에 해당 필드가 설정되어 있지 않습니다.

+0

어떻게 알 수 있습니까? P – JClassic

+0

예. 실수로 전역 변수를 초기화하는 대신 생성자에서 로컬 변수를 초기화했습니다. 감사! –

+1

OP가 스택 추적을 게시했지만 다른 사용자가 게시물을 편집하여 실수로 추적을 삭제했습니다. stacktrace를 보여주기 위해 게시판을 복원했습니다. – dkatzel

관련 문제