【发布时间】:2019-05-14 02:13:31
【问题描述】:
我一直在尝试创建一个“如果你能抓住我”游戏:当我启动它时,它会随机选择分配一个“点击我”按钮的位置。我不应该能够点击按钮,在我能够做到之前,文本应该被重新分配给另一个按钮。
它可以工作一段时间,但随后会引发以下错误:“java.awt.AWTEventMulticaster.mouseMoved”。
我一直在尝试使用 removeListener() 方法解决问题,但我似乎无法找到解决方案。有cmets吗?
这是我的代码:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.*;
public class Game extends JFrame {
//Panels
private JPanel mainPanel = new JPanel();
// Buttons
private JButton[] buttons = new JButton[9];
private JButton theChosenButton = new JButton();
// other
private int random = 0;
public Game() {
this.setTitle("Catch me if you can");
mainPanel.setLayout(new GridLayout(3, 3));
// creates buttons
for(int i = 0; i < 9 ; i++) {
buttons[i] = new JButton();
mainPanel.add(buttons[i]);
}
// Add everything to frame
this.getContentPane().add(mainPanel);
this.setSize(400, 400);
this.setVisible(true);
}
// generates random number between 1 and 9 to be used
public int clickMeGenerator(){
random = (int) Math.floor(Math.random() * 9);
return random;
}
// randomly assigns clickMeGenerator to a button
// add mouseMoved listener to the chosen button
public void assign(){
int randomButton = this.clickMeGenerator();
theChosenButton = buttons[randomButton];
theChosenButton.addMouseMotionListener(new MouseHover());
theChosenButton.setText("Click me");
}
public void removeListener() {
theChosenButton.removeMouseMotionListener(new MouseHover());
//}
}
// inner class
class MouseHover implements MouseMotionListener {
public void mouseMoved(MouseEvent e) {
theChosenButton.setText("");
Game.this.assign();
}
public void mouseDragged(MouseEvent e) {
}
}
} // end of class
测试类:
public class GameTest {
public static void main (String args[]) {
Game myGame = new Game();
myGame.assign();
}
}
非常感谢您的帮助!
【问题讨论】:
-
建议:(1)使用
MouseListener的mouseEntered事件而不是MouseMotionListener的mouseMoved。 (2) 在所有按钮上同时注册监听器。让它测试(在鼠标输入时)事件源是否是当前选择的按钮,在这种情况下只移动标签。 (3)修改你的assign()方法,确保它不会重新选择当前选择的按钮。 -
作为一个单独但重要的事情,构建您的 GUI 并通过
SwingUtilities.invokeAndWait()在事件调度线程上执行初始按钮分配。 Swing 不是线程安全的。 -
为了清楚起见,实际错误是
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError..at java.desktop/java.awt.AWTEventMulticaster.mouseMoved(AWTEventMulticaster.java:337)
标签: java swing user-interface awt jbutton