Java &引用;AWT-EventQueue-0“;图形jpanel

Java &引用;AWT-EventQueue-0“;图形jpanel,java,jframe,int,jpanel,jbutton,Java,Jframe,Int,Jpanel,Jbutton,我对Java比较陌生,遇到了“AWT-EventQueue-0”错误。我尝试了很多次搜索,但仍然无法修复我的代码 GameFrame gf; 我正在尝试用数字制作一个刽子手游戏,程序会创建一个介于1和100之间的随机数。然后程序将创建一个包含100个按钮的按钮网格。你有10次猜测之后,程序将显示一个弹出框,并询问你是否想玩另一个游戏。如果您赢了,程序将发出嘟嘟声,弹出框将出现 GameFrame gf; 这是我的GameFrame类,我在其中创建根面板和按钮网格: ... public

我对Java比较陌生,遇到了“AWT-EventQueue-0”错误。我尝试了很多次搜索,但仍然无法修复我的代码

GameFrame gf; 
我正在尝试用数字制作一个刽子手游戏,程序会创建一个介于1和100之间的随机数。然后程序将创建一个包含100个按钮的按钮网格。你有10次猜测之后,程序将显示一个弹出框,并询问你是否想玩另一个游戏。如果您赢了,程序将发出嘟嘟声,弹出框将出现

GameFrame gf; 
这是我的GameFrame类,我在其中创建根面板和按钮网格:

...
public int wrongGuess = 5;

public GameFrame() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(1000, 500);
        rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.X_AXIS));
        rootPanel.add(getButtonGrid(), BorderLayout.CENTER);
        rootPanel.add(gp, BorderLayout.CENTER);
        add(rootPanel);
        setFocusable(true);
        setCentered(true);
        setVisible(true);
}

private Container getButtonGrid() {
    JPanel buttonsGrid = new JPanel(new GridLayout(10,10,0,0));
    Dimension d = new Dimension(0,20);
    for (int i = 1; i < buttons.length; i++) {
        buttons[i] = new JButton(String.valueOf(i));
        buttons[i].setPreferredSize(d);
        buttons[i].addActionListener(this);
        buttonsGrid.add(buttons[i]);
    }
    return buttonsGrid;
}

@Override public void actionPerformed(ActionEvent ae) {
    boolean win = false;
    wrongGuess = wrongGuess + 1;
    setWrongGuess(wrongGuess);
    int buttonNumber = Integer.valueOf(((JButton) ae.getSource()).getActionCommand());
    if (buttonNumber == ge.getGuessingNumber()) {
        win = true;
        buttons[buttonNumber].setBackground(new Color(60,179,113));
        buttons[buttonNumber].setOpaque(true);
        Toolkit.getDefaultToolkit().beep();
        ge.start();
    } else {
        if (buttonNumber > ge.getGuessingNumber()) {
            buttons[buttonNumber].setBackground(new Color(220,20,60));
            buttons[buttonNumber].setOpaque(true);
        }
        if (buttonNumber < ge.getGuessingNumber()) {
            buttons[buttonNumber].setBackground(new Color(255,255,102));
            buttons[buttonNumber].setOpaque(true);
        }
    }
    if (wrongGuess == 10) {
        win = true;
        ge.start();
        setWrongGuess(0);
    }
    if (win == true) {
        for (int i = 1; i < buttons.length; i++) {
            buttons[i].setBackground(null);
        }
    }
}
...
GameFrame gf; 
我假设我说的“猜错了”,但我不知道我做错了什么。有人能帮我找到解决这个错误的正确方法吗

GameFrame gf; 
我的错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at micro.project.GamePanel.paint(GamePanel.java:21)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
at javax.swing.JComponent.paint(JComponent.java:1042)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
at java.awt.Container.paint(Container.java:1975)
at java.awt.Window.paint(Window.java:3904)
at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
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)
GameFrame gf; 

PS:很抱歉我的英语不好这是一个典型的空指针异常

GameFrame gf; 
然后像gf.ErrorGuess()一样引用它;没有实例化像这样的对象

GameFrame gf; 
gf = new GameFrame();

gf不会指向任何对象,它只是对空的引用,因此它会抛出一个NPE

GamePanel
中对
GameFrame
的引用是
null
,而您需要将
GameFrame
的引用传递给
GamePanel

GameFrame gf; 
GameFrame gf;

public GamePanel(GameFrame gf) {
    this.gf = gf;
    // Pointless as the layout manager will take care of it
    //this.setSize(500, 500);
    // Pointless as Swing components are visible by default
    //this.setVisible(true);
    this.setFocusable(true);
}

@Overrride
protected void paintComponent(Graphics comp) {
    super.paintComponent(comp);
    int wrongGuess = gf.wrongGuess;

    if (wrongGuess == 5) {
        comp.drawOval(162, 150, 50, 50);
        comp.drawLine(188, 200, 188, 275);
        comp.drawLine(148, 235, 188, 215);
        comp.drawLine(188, 215, 228, 235);
        comp.drawLine(188, 275, 228, 335);
        comp.drawLine(148, 335, 188, 275);
    }
    // Don't do this here, this will cause no end of issues
    //repaint();
}

另外,您正在重写
paint
,但调用了
super.paintComponent
,这会破坏整个绘制链-除非您真的知道自己在做什么,否则不要这样做。相反,正如演示的那样,只需覆盖
paintComponent

我的猜测是
gf
null
@MadProgrammer我已经看过很多次了confused@MadProgrammer对的但问题是它不能为null,因为它等于5在
GamePanel
中对
GameFrame
的引用是
null
。另外,您已经重写了
paint
并正在调用
super.paintComponent
,这不是一个好主意,请改为重写
paintComponent
(并调用
super.paintComponent
)Hm。。。好的,在这种情况下,我是否必须为根面板创建另一个类,然后将这些面板指向我的根?因为如果我说
GameFrame gf=newgameframer()程序将给我另一个错误
java.lang.StackOverflowerError
你只需将
GameFrame
的引用传递给
GamePanel
你应该在GamePanel中有一个接受GameFrame参数的构造函数,然后在构造函数中指定你在GameFrame中实例化的对象,使gf=GameFrame您最初创建并通过构造函数传递的对象,然后您可以在GamePanel中的任何位置使用相同的对象谢谢您的建议。抱歉问了这么多问题。如果我在GamePanel类中创建构造函数,我将无法显示我的“刽子手面板”,因为我正在调用我的
GameFrame
类中的
GamePanel
。在这种情况下,线程“main”java.lang.NullPointerException中会出现一个
异常。如果没有一个完全可运行的示例来演示您的问题,就不可能提供一个完全合格的答案,因为您一直在为我们不知道的谜题添加碎片,这是我们所能做的最好的,只是对问题的部分看法。无论如何,非常感谢!我根据你的答案找到了解决办法。你帮了我很多:)
GameFrame gf;