【问题标题】:Getting an error and I can't see what出现错误,我看不到什么
【发布时间】:2014-08-09 18:23:50
【问题描述】:

当我尝试通过按下按钮创建新对象时不断收到错误消息。帮助和解释将不胜感激我的猜测是这里有一个胭脂()?或其他容易发现但我没有看到的东西

public class Main extends JFrame {
int GWIDTH = 400;
int GHEIGHT = 300;

private Image dbImage;
private Graphics dbg;

int x,y;
int rectX, rectY;
int random;

boolean mouseOnScreen;
boolean mouseDragged;

int click = 0;
int Resource = 0;
int ore = 100; 

int mx, my;


public Main(){

    setSize(GWIDTH, GHEIGHT);
    setTitle("Game");
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addMouseListener(new Mouse());



    frame(dbg);



    x = 0;
    y = 0;

    random = 100;

}

private void frame(Graphics g) {
     JFrame f = new JFrame();
     f.setVisible(true);
     f.setSize(400, 400);

     JPanel p = new JPanel();
     JButton b1 = new JButton("New ore");
     JButton b2 = new JButton("New worker");
     JButton b3 = new JButton("Upgrade pick");
     JButton b4 = new JButton("Turret");
     JButton b5 = new JButton("Barrack");
     b1.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
             JOptionPane.showMessageDialog(null,"Succses!");
             System.out.println(Resource-=ore);
             Rectangle r3 = new Rectangle(300, 50, 50, 50);
             g.setColor(Color.RED);
             g.fillRect(r3.x, r3.y, r3.width, r3.height);
         }
     });
     p.add(b1);
     p.add(b2);
     p.add(b3);
     p.add(b4);
     p.add(b5);
     f.add(p);
}

public class Mouse extends MouseAdapter implements MouseMotionListener {
    @Override
    public void mousePressed(MouseEvent e){
        click += e.getClickCount();
        rectX = e.getX();
        rectY = e.getY();
        y = rectY;
        x = rectX;

        Rectangle r1 = new Rectangle(rectX, rectY, 7, 7);
        Rectangle r2 = new Rectangle(175, 75, 50, 50);





        if(r1.intersects(r2))
        Resource += e.getClickCount();






    }
    @Override
    public void mouseReleased(MouseEvent e){

}

    @Override
    public void mouseEntered(MouseEvent e){
        mouseOnScreen = true;

        rectX = e.getX();
        rectY = e.getY();
    }
    @Override
    public void mouseExited(MouseEvent e){
        mouseOnScreen = false;
        rectX = e.getX();
        rectY = e.getY();
    }
    @Override
    public void mouseDragged(MouseEvent e){
        click += e.getClickCount();
        rectX = e.getX();
        rectY = e.getY();

        mouseDragged = true;


        e.consume();
    }
    @Override
    public void mouseMoved(MouseEvent e){
        rectX = e.getX();
        rectY = e.getY();


        e.consume();
    }
}



    public void paint(Graphics g){
        dbImage = createImage(getWidth(), getHeight());
        dbg = dbImage.getGraphics();
        paintComponent(dbg);
        g.drawImage(dbImage, 0, 0, this);
    }


    public void paintComponent(Graphics g){
    g.fillOval(x, y, 7, 7);
    g.setColor(Color.red);
    g.drawString("Clicks ("+click+")", 40, 40);

    Rectangle r1 = new Rectangle(rectX, rectY, 7, 7);
    Rectangle r2 = new Rectangle(175, 75, 50, 50);
    Rectangle r3 = new Rectangle(300, 50, 50, 20);



    g.setColor(Color.RED);
    g.fillRect(r2.x, r2.y, r2.width, r2.height);

    g.setColor(Color.BLUE);
    g.fillRect(r1.x, r1.y, r1.width, r1.height);








        g.drawString("Resources:("+Resource+")", 40, 50);


    repaint();
}







public static void main (String[] args) {
   Main main = new Main();
}
}

这是我的错误

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at main.Main$1.actionPerformed(Main.java:80)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6527)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6292)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4883)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4705)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2739)
at java.awt.Component.dispatchEvent(Component.java:4705)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

【问题讨论】:

  • 这是什么? System.out.println(Resource-=ore); 只需按照堆栈跟踪中引用的行号即可。
  • 最重要的是,您需要了解如何调试 NPE (NullPointerException) 的一般概念。 您应该仔细检查引发异常的行,找出哪个变量为空,然后回溯到您的代码中找出原因。你会一次又一次地遇到这些,相信我。
  • @Julian,复合语句?用户...,看起来你在第 80 行有一个 null 罪魁祸首。去看看它是什么。
  • 您对 java.awt.Graphics 的使用是有问题的,因为您在课堂上使用了 Graphics 字段,这是一件危险的事情。顺便问一下,上面代码的第 80 行是哪一行?
  • 另外,如果您需要帮助找出答案,请在您的帖子中说明哪一行是第 80 行。我不会开始计算程序中的行数来确定哪一行是第 80 行。(而且发帖者经常删除额外的 cmets 或只发布他们的部分代码,所以我无法确定我的计数是否给出正确的行。)

标签: java swing nullpointerexception


【解决方案1】:

正如我所怀疑的(请参阅我的 cmets 对您的原始问题之一),您错误地使用了 Graphics 对象并尝试使用 null Graphics 变量进行绘制。建议:

  • 不要给你的类一个 Graphics 字段,也不要像你试图做的那样将 Graphics 对象传递给你的 frame 方法。
  • 而是使用 JVM 提供给您的 Graphics 对象在 paintComponent 方法内部进行绘制。
  • 或者使用从 BufferedImage 或其他图像中提取的 Graphics 对象进行绘制,但如果这样做,请务必在处理完 Graphics 对象后将其丢弃。
  • 同样,最重要的是,您需要了解如何调试 NPE (NullPointerException) 的一般概念。 您应该仔细检查引发异常的行,找出哪个变量为空,然后回溯到您的代码中找出原因。你会一次又一次地遇到这些,相信我。

  • 另外,不要在paintComponent 方法中调用repaint(),因为这是尝试制作动画的一种非常糟糕且不受控制的方式。如果您想要简单的动画,请改用 Swing Timer。
  • 要获得更多和更好的帮助,请尝试向我们提供更多详细信息,说明您尝试使用此代码执行的操作。
  • 如果您的目标是让一个类向另一个类添加一个新的 Rectangle,则为第二个类提供第一个类可以调用的 addRectangle(Rectangle r) 方法。在该方法中,考虑将参数添加到作为字段的 ArrayList<Rectangle>
  • 然后在绘制矩形时遍历列表在检查鼠标点击时。

例如:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.*;

public class AddRandomRects {

   private static void createAndShowGui() {
      JFrame frame = new JFrame("AddRandomRects");

      MainPanel mainPanel = new MainPanel();

      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);

      DialogPanelCreator dialogPanelCreator = new DialogPanelCreator(mainPanel);
      JDialog dialog = new JDialog(frame, "Create and Remove Rect Dialog", ModalityType.MODELESS);
      dialog.getContentPane().add(dialogPanelCreator.getMainComponent());
      dialog.pack();
      dialog.setLocationRelativeTo(frame);
      dialog.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class MainPanel extends JPanel {
   public static final int PREF_W = 800;
   public static final int PREF_H = PREF_W;
   public static final int RECT_WIDTH = 70;
   private static final Color RECT_COLOR = Color.RED;
   private static final Color RECT_BORDER_COLOR = Color.BLUE;
   private static final Stroke RECT_BORDER_STROKE = new BasicStroke(3f);

   private List<Rectangle> rectList = new ArrayList<>();

   public MainPanel() {
      rectList.add(new Rectangle(100, 100, RECT_WIDTH, RECT_WIDTH));
   }

   public void addRectangle(int x, int y) {
      Rectangle r = new Rectangle(x, y, RECT_WIDTH, RECT_WIDTH);
      rectList.add(r);
      repaint();
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g.create();
      for (Rectangle rect : rectList) {
         g2.setColor(RECT_COLOR);
         g2.fill(rect);
         g2.setColor(RECT_BORDER_COLOR);
         g2.setStroke(RECT_BORDER_STROKE);
         g2.draw(rect);
      }
      g2.dispose();
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public void removeLastRectangle() {
      if (rectList.size() > 0) {
         rectList.remove(rectList.size() - 1);
         repaint();
      }
   }
}

@SuppressWarnings("serial")
class DialogPanelCreator {
   private JPanel panel = new JPanel();
   private MainPanel mainPanel;
   private Random random = new Random();

   public DialogPanelCreator(MainPanel mainPanel) {
      this.mainPanel = mainPanel;
      panel.add(new JButton(new AddRectangleAction("Add Rectangle", KeyEvent.VK_A)));
      panel.add(new JButton(new RemoveLastRectangleAction("Remove Last Rectangle", KeyEvent.VK_R)));
   }

   public JComponent getMainComponent() {
      return panel;            
   }

   private class AddRectangleAction extends AbstractAction {
      public AddRectangleAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         int x = random.nextInt(MainPanel.PREF_W - MainPanel.RECT_WIDTH);
         int y = random.nextInt(MainPanel.PREF_H - MainPanel.RECT_WIDTH);

         mainPanel.addRectangle(x, y);
      }
   }

   private class RemoveLastRectangleAction extends AbstractAction {
      public RemoveLastRectangleAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         mainPanel.removeLastRectangle();
      }
   }

}

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2014-12-13
    • 2017-06-20
    • 2015-09-26
    相关资源
    最近更新 更多