2016-08-03 57 views
0

我一直在试图为我的游戏做一家商店。 这是不成功的。如何在使用Graphics2D尝试在JPanel上呈现时如何解决此NullPointerException?

我试过drawComponent,没有工作。 没有错误,代码执行,但没有奏效。 现在我想要做的事:

private void render() { 
    Graphics2D g = (Graphics2D) graphics.getGraphics(); 

    ///////////////////// 
    g.drawImage(img, 0, 0, WIDTH, HEIGHT, null); 
    ///////////////////// 
    g.dispose(); 

    Graphics2D g2d = (Graphics2D) getGraphics(); 
    g2d.drawImage(img, 0, 0, null); 
    g2d.dispose(); 
} 

现在我得到G2D一个NullPointerException。 我试过了一切。

`Exception in thread "game" java.lang.NullPointerException 
    at com.johnythecarrot.game.Shop$DrawPane.access$2(Shop.java:123) 
    at com.johnythecarrot.game.Shop.render(Shop.java:154) 
    at com.johnythecarrot.game.Game.render(Game.java:75) 
    at com.johnythecarrot.game.Game.run(Game.java:112) 
    at java.lang.Thread.run(Unknown Source)` 

我的目标是能够有可点击的按钮。 它是DID的工作。但我几乎每次都必须重新启动。因为大部分时间代码甚至没有执行。所以我试图修复它。现在全都搞砸了。

这是它的代码。 (DoubleInt是我的媒体库的一部分,它无非只是X和Y更多。)

public class Shop { 

    public BuildWindow window; 
    public static JWindow w; 

    private int WIDTH = 860, HEIGHT = 440; 

    private BufferedImage graphics = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 

    public DrawPane drawPane; 

    public Shop() { 
     //window = new BuildWindow().setSize(new DoubleInt(100, 100)).at(wi, he).setTitle("Shop").setOpacity(1).setDragable(false).showEmpty(true); 
     w = new JWindow(); 
     w.setOpacity(1); 
     w.setSize(WIDTH, HEIGHT); 
     w.setLocation(800, 800); 
     w.setVisible(false); 
     w.setAlwaysOnTop(true); 
     //graphics = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 

    } 

    private void createShop() { 
     /***Graphics2D g = (Graphics2D) graphics.getGraphics(); 
     g.setColor(Color.blue); 
     g.drawString("hey", WIDTH-50, HEIGHT-50); 
     g.fillRect(0, 0, WIDTH, HEIGHT);*/ 
    } 

    public class DrawPane extends JPanel { 

     int width = WIDTH; 
     int height = HEIGHT; 
     private ArrayList<Shape> buttons; 
     private Shape btn1 = new Rectangle2D.Double(20, 60, width/2, height-20); 
     private Shape btnClose = new Rectangle2D.Double(width-25, 5, 20, 20); 

     Point wCoords; 
     Point mCoords; 

     public DrawPane() { 
      buttons = new ArrayList<>(); 
      buttons.add(btn1); 
      buttons.add(btnClose); 
      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        super.mouseClicked(e); 
        for(Shape s : buttons) { 
         if(s.contains(e.getPoint())) { 
          System.out.println("Clicked " + s.getBounds()); 
          if(s == btnClose) { 
           w.dispose(); 
          } 
         } 
        } 
       } 
       @Override 
       public void mousePressed(MouseEvent e) { 
        mCoords = e.getPoint(); 
       } 
       @Override 
       public void mouseReleased(MouseEvent arg0) { 
        mCoords = null; 
       } 
      }); 
      addMouseMotionListener(new MouseMotionAdapter() { 
       public void mouseDragged(MouseEvent e) { 
       wCoords = e.getLocationOnScreen(); 
       w.setLocation(wCoords.x - mCoords.x, wCoords.y - mCoords.y); 
       } 
      }); 
     } 

     void repaintThis() { 
      repaint(); 
     } 

     BufferedImage img = loadImageFrom.LoadImageFrom(Shop.class, "bar.png"); 

     Graphics gb; 

     /** 
     * super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g; 
      g.setColor(Color.red); 
      //g.fillRect(0, 0, width, 50); 
      g.drawImage(img, 0, 0, width, 50, null); 
      g.setColor(Color.WHITE); 
      g.drawString("SHOP", 15, 30); 
      g.drawString("X", width-20, 20); 
      for(Shape b : buttons) { 
       g2d.draw(b); 
      } 
      System.out.println("Built"); 
      gb = g; 
     */ 

     private void render() { 
      Graphics2D g = (Graphics2D) graphics.getGraphics(); 

      ///////////////////// 
      g.drawImage(img, 0, 0, WIDTH, HEIGHT, null); 
      ///////////////////// 
      g.dispose(); 

      Graphics2D g2d = (Graphics2D) getGraphics(); 
      g2d.drawImage(img, 0, 0, null); 
      g2d.dispose(); 
     } 

     public void Build() { 
      Graphics g = gb; 
      Graphics2D g2d = (Graphics2D) g; 
      g.setColor(Color.red); 
      //g.fillRect(0, 0, width, 50); 
      g.drawImage(img, 0, 0, width, 50, null); 
      g.setColor(Color.WHITE); 
      g.drawString("SHOP", 15, 30); 
      g.drawString("X", width-20, 20); 
      for(Shape b : buttons) { 
       g2d.draw(b); 
      } 
      System.out.println("Built"); 
     } 

    } 

    public void render(Graphics2D g) { 
      drawPane.render(); 
    } 

    public void addDrawPane() { 
     drawPane = new DrawPane(); 
     w.add(drawPane); 
    } 
} 

如果您需要获得更多的代码,只是问我。

+0

看起来'grahpics'是'null' –

+0

不应该'g'是'Graphics'对象吗? –

+0

使用paintComponent()的代码更新你的问题好吗? –

回答

1

你应该覆盖paintComponent方法是这样的:

public class DrawPane extends JPanel { 

    // all your variables and other things 

    @Override 
    paintComponent(Graphics g) { 
    Graphics2D g2d = (Graphics2D) g; 
    // Your code goes here, use the g2d 

    } 

} 

然后如果你需要重新绘制你的组件,只需调用重绘()就可以了。

+0

我已经完成了两个。重绘发生,但我仍然没有看到任何东西。这是奇怪的事情。被称为太早或太迟的事情可能有问题。 –

相关问题