Прослушивание действий на внутренней панели JPanel из JFrame

У меня есть JFrame, в котором есть BottomPanel (класс, который я создал, который расширяет JPanel). И внутри этого JPanel находится еще один JPanel, называемый DicePanel (который снова расширяет JPanel).

В DicePanel есть кнопка «Конец хода», при нажатии которой должен завершиться текущий ход игроков в настольной игре, на которой основана программа. Я хочу как-то прослушать событие buttonClicked от DicePanel изнутри моего JFrame.

Как мне это сделать?

Изменить: прямо сейчас у меня есть

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) {
        }
    }
}

person Sean    schedule 24.08.2010    source источник
comment
Перенесен код из комментария для удобства чтения; пожалуйста, верните, если неправильно.   -  person trashgod    schedule 25.08.2010


Ответы (2)


Почему?

Я имею в виду, вы, вероятно, могли бы сделать это, определив кнопку в вашем JFrame и передав ее, пока вы не сможете поместить ее в DicePanel, но зачем вам вообще нужно добавлять прослушиватель в JFrame?

person zigdon    schedule 24.08.2010
comment
Итак, игра идет правильно, и это один ход игроков. Когда нажата кнопка «Конец хода», я хочу закончить свой ход. По сути, мне нужно сделать цикл while, который говорит: «Пока его ход не закончился wait». Когда кнопка нажата, мне нужно установить логическое значение или что-то еще, чтобы метод Turn() знал, что его ход окончен. - person Sean; 25.08.2010
comment
Сейчас у меня есть: 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()); в то время как (истина) { попытка { // перерыв; System.out.println(Ожидание); // Thread.sleep(2000); } поймать(Исключение e){ } } } - person Sean; 25.08.2010
comment
Но это просто создает бесконечный цикл, и кадр не отображается (поскольку метод paint() никогда не вызывается системой, я думаю, из-за цикла). Может быть, мне нужно сделать еще один поток - один для метода Turn и один для графического интерфейса? - person Sean; 25.08.2010
comment
В общем, это очень хорошая идея, чтобы ваш графический интерфейс был в отдельном потоке, чем ваш фактический код, чтобы ваши главные окна оставались отзывчивыми, пока вы выполняете вычисления в фоновом режиме. - person zigdon; 25.08.2010

Вы можете использовать setDefaultButton(), "который будет активирован, когда событие активации, определенное пользовательским интерфейсом (обычно клавиша Enter), происходит в корневой области независимо от того, имеет ли кнопка фокус клавиатуры. "

JFrame f = new JFrame("Dice Game");
JButton b = new JButton("End Turn");
f.getRootPane().setDefaultButton(b);

Вот очень простой пример, который предлагает, как вы можете структурировать свою игру, чтобы избежать бесконечного цикла, не прибегая к нескольким потокам.

Кроме того, не стоит ловить исключение без хотя бы некоторых выходных данных, например. e.printStackTrace().

person trashgod    schedule 25.08.2010