"AWT-EventQueue-0" 图形 jpanel
"AWT-EventQueue-0" graphics jpanel
我是 Java 的新手,遇到了 "AWT-EventQueue-0" 错误。我尝试了很多搜索,但仍然无法修复我的代码。
我正在尝试用数字制作 Hangman 游戏,程序会创建一个 1 到 100 之间的随机数。然后程序将创建一个包含 100 个按钮的按钮网格。在你猜了 10 次之后,程序会显示一个弹出框,询问你是否想玩另一个游戏。如果你赢了,程序会发出哔哔声,弹出框会出现。
这是我的 GameFrame class,我在其中创建根面板和按钮网格:
...
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);
}
}
}
...
每当用户猜错时,我想显示一个"Hangman part"(例如手臂,腿...等)。
这是我的游戏面板class:
GameFrame gf;
public GamePanel() {
this.setSize(500, 500);
this.setVisible(true);
this.setFocusable(true);
}
public void paint(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);
}
repaint();
}
我假设我错误地声明了 "wrongGuess" 但我不知道我做错了什么。谁能帮我找到解决此错误的正确方法?
我的错误:
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.run(RepaintManager.java:842)
at javax.swing.RepaintManager.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.access00(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.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:709)
at java.awt.EventQueue.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)
PS: 抱歉我的英语不好
这是一个典型的空指针异常,任何时候你声明一个像
这样的引用
GameFrame gf;
然后像 gf.wrongGuess() 一样引用它;没有实例化
这样的对象
gf = new GameFrame();
gf 不会指向任何对象,它只是对任何对象的引用,所以它会抛出 NPE
对GameFrame
的引用是GamePanel
中的null
,您需要将GameFrame
的引用传递给GamePanel
...
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
我是 Java 的新手,遇到了 "AWT-EventQueue-0" 错误。我尝试了很多搜索,但仍然无法修复我的代码。
我正在尝试用数字制作 Hangman 游戏,程序会创建一个 1 到 100 之间的随机数。然后程序将创建一个包含 100 个按钮的按钮网格。在你猜了 10 次之后,程序会显示一个弹出框,询问你是否想玩另一个游戏。如果你赢了,程序会发出哔哔声,弹出框会出现。
这是我的 GameFrame class,我在其中创建根面板和按钮网格:
...
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);
}
}
}
...
每当用户猜错时,我想显示一个"Hangman part"(例如手臂,腿...等)。
这是我的游戏面板class:
GameFrame gf;
public GamePanel() {
this.setSize(500, 500);
this.setVisible(true);
this.setFocusable(true);
}
public void paint(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);
}
repaint();
}
我假设我错误地声明了 "wrongGuess" 但我不知道我做错了什么。谁能帮我找到解决此错误的正确方法?
我的错误:
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.run(RepaintManager.java:842)
at javax.swing.RepaintManager.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.access00(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.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:709)
at java.awt.EventQueue.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)
PS: 抱歉我的英语不好
这是一个典型的空指针异常,任何时候你声明一个像
这样的引用GameFrame gf;
然后像 gf.wrongGuess() 一样引用它;没有实例化
这样的对象gf = new GameFrame();
gf 不会指向任何对象,它只是对任何对象的引用,所以它会抛出 NPE
对GameFrame
的引用是GamePanel
中的null
,您需要将GameFrame
的引用传递给GamePanel
...
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