java - 尝试使用 Graphics2D 在 JPanel 上渲染时,如何修复此 NullPointerException?

标签 java nullpointerexception jpanel graphics2d jwindow

我一直在尝试为我的游戏创建一个商店。 这次没有成功。

我尝试过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)`

我的目标是能够拥有可点击的按钮。 它确实有效。但我几乎每次都必须重新启动。因为大部分时间甚至没有执行代码。所以我尝试修复它。现在一切都乱了。

这是它的代码。 (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);
    }
}

如果您需要访问更多代码,请询问我。

最佳答案

您应该像这样重写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

  }

}

然后,如果您需要重新绘制组件,只需对其调用 repaint() 即可。

关于java - 尝试使用 Graphics2D 在 JPanel 上渲染时,如何修复此 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38741138/

相关文章:

java - 重载的包私有(private)方法导致编译失败 - 这是 JLS 怪异还是 javac bug?

intellij-idea - 谷歌 Guava checkNotNull 和 IntelliJ IDEA 的 "may produce java.lang.NullPointerException"

java - 在范围之间添加一个数字

java - 使 JTextArea 可序列化

java - BoxLayout 未显示所有组件

java - 当该类被其他类扩展时如何防止额外的 JFrame

java - 使用 Jersey Client 在 POST 中发送名称值对

java - groovy代码测试java代码的代码覆盖率

java - Gradle 尝试编译 jar 的源代码

java - 如何使用 Java 在 JPanel 中显示 JTable?