简体   繁体   English

在paint方法Java内部调用对象方法

[英]Calling object methods inside the paint method Java

Sorry for my bad grasp on Java Graphics. 对不起,我对Java Graphics的掌握不好。 So, I have this paint method: 所以,我有这种绘画方法:

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);
}

Any everything works nicely, with the rectangles and the text showing up. 任何东西都可以很好地显示矩形和文本。

Then I change it to: 然后我将其更改为:

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());
}

And suddenly nothing shows up. 突然什么也没出现。 (Not even the text that had shown up before) "sh" is an instance of my Shape class. (甚至没有显示过的文本)“ sh”是Shape类的一个实例。 The methods called are fairly self explanatory (Setters and getters), but included at the end for reference. 所调用的方法很容易解释(Setters和getters),但在最后将其包括在内以供参考。

Why does this happen? 为什么会这样? I also get a slew of terminal errors, if it's of any use I'll post them here. 我还会遇到很多终端错误,如果有什么用,我会在这里发布。 I mean, I wouldn't expect setters and getters to cause things to disappear or any significant errors (Note that things still disappear when I remove the "sh.draw(window)" as well). 我的意思是,我不希望设置器和获取器导致事情消失或任何重大错误(请注意,当我删除“ sh.draw(window)”时,事情仍然会消失)。 Is there a problem with calling object methods inside the paint method? 在paint方法内部调用对象方法是否存在问题? What could I do instead? 我该怎么办呢?

Methods for reference, but not needed to understand the code : 供参考的方法,但不需要了解代码:

   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;
       }

Terminal Errors: 终端错误:

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)

You are getting a NullPointerException in your paint method line 48. 在绘制方法第48行中,您将获得NullPointerException

I would guess your field sh is not set before you call methods on it 我猜你没有在调用方法之前设置了字段sh

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM