2010-08-24 3 views
1

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

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

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

Edit: Сейчас у меня есть

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

Переносимый код из комментария для удобочитаемости; пожалуйста, верните, если это неверно. – trashgod

ответ

0

Почему?

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

+0

Итак, игра идет прямо, и это один игрок поворачивается. Когда нажата кнопка «Повернуть конец», я хочу закончить свою очередь. Bascially Мне нужно сделать цикл while, в котором говорится: «Пока его очередь не заканчивается * wait *». Когда кнопка нажата, мне нужно установить логическое значение или что-то, чтобы метод Turn() знал, что его очередь закончена. – Sean

+0

Прямо сейчас у меня есть: \t \t для (игрока р: f.playerList) { \t \t \t INT diceRoll = dice.roll(); \t \t \t System.out.println (p.move (diceRoll)); \t \t \t System.out.println (p.getCurrentCell()); \t \t \t System.out.println (diceRoll); \t \t \t f.bottomPanel.dice.setDice (dice.getDice1(), dice.getDice2()); \t \t \t \t \t \t в то время (правда) { \t \t \t \t Ьгу { \t \t \t \t \t // перерыв; \t \t \t \t \t System.out.Println ("Ожидание"); \t \t \t \t \t // Thread.sleep (2000); \t \t \t \t} \t \t \t \t поймать (Exception е) { \t \t \t \t} \t \t \t} \t \t} – Sean

+0

Но это только делает бесконечный цикл и не отображается рамка (из-за краски() метод никогда не вызывается системой, я думаю, из-за цикла). Может быть, мне нужно сделать еще один поток - один для метода Turn и один для графического интерфейса? – Sean

0

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

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

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

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