Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JFrame侦听内部JPanel上的操作_Java_Action_Jframe_Listener_Jpanel - Fatal编程技术网

Java 从JFrame侦听内部JPanel上的操作

Java 从JFrame侦听内部JPanel上的操作,java,action,jframe,listener,jpanel,Java,Action,Jframe,Listener,Jpanel,我有一个JFrame,里面有一个底部面板(我制作的一个扩展JPanel的类)。 在这个JPanel内部是另一个名为DicePanel的JPanel(它再次扩展了JPanel) 在骰子面板中有一个名为“结束回合”的按钮,当点击该按钮时,该按钮将结束该程序所基于的棋盘游戏的玩家当前回合。我想从JFrame中的DicePanel中监听buttonClicked事件 我该怎么做 编辑:现在我有 for (Player p : f.playerList) { int diceRoll = dice

我有一个JFrame,里面有一个底部面板(我制作的一个扩展JPanel的类)。 在这个JPanel内部是另一个名为DicePanel的JPanel(它再次扩展了JPanel)

在骰子面板中有一个名为“结束回合”的按钮,当点击该按钮时,该按钮将结束该程序所基于的棋盘游戏的玩家当前回合。我想从JFrame中的DicePanel中监听buttonClicked事件

我该怎么做

编辑:现在我有

for (Player p : f.playerList) {
    int diceRoll = dice.roll();
    System.out.println(p.move(diceRoll));
    System.out.println(p.getCurrentCell());
    System.out.println(diceRoll);
    f.bottomPanel.dice.setDice(dice.getDice1(), dice.getDice2());
    while (true) {
        try {
            break;
            System.out.println("Waiting");
            Thread.sleep(2000);
        } catch (Exception e) {
        }
    }
}
为什么?

我的意思是,您可以通过在JFrame中定义按钮来实现,并将其传递,直到您可以将其放置在DicePanel中,但是为什么您首先需要在JFrame中添加一个侦听器呢?

您可以使用,“当UI定义的激活事件(通常是Enter键)时,它将被激活。”在根窗格中发生,无论按钮是否具有键盘焦点。“

这里有一个非常简单的建议,建议您如何构建您的游戏,以避免无限循环而不诉诸多线程


顺便说一句,捕获异常时至少要输出一些输出,例如
e.printStackTrace()
,这是个坏主意

好的,游戏进行得很顺利,现在轮到一名玩家。单击结束转弯按钮时,我想结束转弯。基本上,我需要做一个while循环,上面写着“当轮到他时,等待”。当按下按钮时,我需要设置一个布尔值或其他值,让Turn()方法知道他的回合已经结束。现在我有:for(Player p:f.playerList){int diceRoll=dice.roll();System.out.println(p.move(diceRoll));System.out.println(p.getCurrentCell();System.out.println(diceRoll);f.bottomPanel.dice.setDice(dice.getDice1(),dice.getDice2());while(true){try{//break;System.out.println(“Waiting”);///Thread.sleep(2000);}catch(异常e){}}}}但这只会产生一个无限循环,并且帧不会显示(因为paint()是方法从未被系统调用(我猜是因为循环)。也许我需要创建另一个线程-一个用于Turn方法,另一个用于GUI?一般来说,将GUI放在与实际代码不同的线程上是一个非常好的主意-这样,当您在后台进行计算时,您的主窗口将保持响应。为了可读性,请从注释中迁移代码;如果不正确,请还原。
JFrame f = new JFrame("Dice Game");
JButton b = new JButton("End Turn");
f.getRootPane().setDefaultButton(b);