2012-05-11 2 views
6

У меня есть игра в блэкджек, которую я сделал на Java, и я хочу сообщить о начале игры, нажав кнопку. Все мои слушатели по работе работают очень хорошо и все такое, но проблема кроется в том, что я не могу понять, как начать игру, не запуская ее полностью в методе actionPerformed. Очевидно, что функция, постоянно работающая в методе actionPerformed, эффективно отключит остальную часть моего графического интерфейса. Вот фрагмент кода ....Запустите игру из прослушивателя действий

go.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
       // START GAME SOMEHOW but must run outside of action listener 
     } 
    }); 
+0

Что делает игра при запуске? Он не должен иметь петлю. Все действия пользователя должны быть событиями. –

+0

Я думаю, что хорошим решением может быть не запуск всей игры, а просто раздача карт и возврат. Однако я хотел бы знать, как запустить программу из прослушивателя действий. Я бы предположил, что это возможно, но я новичок в Java и действительно все эти вычислительные машины. Любые советы были бы очень признательны !!! :) –

+0

Спасибо за ваш повтор, JB. Изначально я инициализировал новую игру, которая запускает всю вещь внутри своего конструктора, поэтому метод actionPerformed просто имел строку: «game g = new game()» Однако теперь, когда вы упоминаете, что это должно быть событие только я настолько уверен, что делаю это неправильно. haha –

ответ

1

Вы игра, вероятно, следует начать в своем собственном потоке и управлять ими, что само по себе (трудно сказать), но чтобы вы собираетесь вы могли бы начать свою игру в новом «внешний» нить, что-то вроде этого в вашем actionPerformed:

public void actionPerformed(ActionEvent e) { 
    Thread thread = new Thread("Game thread") { 
     public void run() { 
      startGame(); //or however you start your game 
     } 
    }; 
    thread.start(); 
} 
+0

Если это «управляемое/непрерывное анимированное приложение с кадрами в секунду», я бы сказал, что начиная отдельный поток, который * запускается *, игра кажется плохой идеей. ActionPerfomed должен просто настроить пользовательский интерфейс, вернуться и ждать дальнейших действий пользователя. – aioobe

+0

Ну, это то, что я предполагал, так как игра не возвращается, это не звучит для меня. –

7

Очевидно, что функция работает непрерывно в рамках метода actionPerformed будет эффективно отключить остальную часть моего GUI.

Это действительное наблюдение и показывает, что вы понимаете основное правило при работе с Swing.

Ваша игра, скорее всего, управляется событиями (исправьте меня, если я ошибаюсь), поэтому действие, выполняемое кнопкой, должно просто установить программу в новое состояние, ожидая дальнейших событий. Это ничто не должно занимать много времени, и обычно это делается непосредственно EDT.

Конечно, если вы хотите сделать причудливую анимацию начала новой игры, которая должна выполняться в отдельном потоке, в этом случае вы просто запускаете поток анимации (я бы рекомендовал использовать SwingWorker, хотя) из в методе actionPerformed, а затем вернуться.

В коде, я думаю, это будет выглядеть примерно так:

go.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 

     // Remove the menu components 
     someJPanel.removeAll(); 

     // Show the game table 
     someJPanel.add(new GamePanel()); 

     someJPanel.revalidate(); 
     someJPanel.repaint(); 

     // done. Wait for further user actions. 
    } 
}); 
+0

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

+1

Да, добро пожаловать в stackoverflow :-) – aioobe

1

Я считаю, что вы хотите продлить javax.swing.SwingWorker.

Функция запуска не-ui будет работать в doInBackground, а метод done будет вызываться, когда он закончит обновление ui.

Есть даже пример в описании класса javadoc для обновления панели прогресса со статусом того, что происходит при запуске.

Смежные вопросы