2013-08-01 3 views
1

Я ищу способ заставить мою программу дождаться нажатия кнопки для продолжения функции. В моей основной функции я вызываю функцию, которая показывает мой основной графический интерфейс, используя JPanel, кнопки и метки. Конечно, он показывает GUI и заканчивается, что функция не позволяет мне изменить GUI.Ждите нажатия кнопки JButton

public static Player player = new Player(); 
    public static Gui gui = new Gui(); 
    public static boolean inMain = true; 
    public static boolean inBattle = false; 

    public static void main(String[] args){ 
    showMainGui(); 
    } 

Я думаю, что им ищет что-то, что будет выглядеть следующим образом:

public static void main(String[] args){ 
    showMainGui(); 
    while(inBattle == false){ 
     // wait until inBattle changes 
    } 
} 

, что в то время как цикл будет цикл и ждать, пока кнопка создана в showMainGui не меняет inBattle к истине. Как я мог это сделать точно? Это меня довольно смущает. Моя цель - щелкнуть JButton и кнопки сменить на разные кнопки

Мой исполнитель действия для моей кнопки, созданной на showMainGui();

public class Hunt implements ActionListener{ 

    @Override 
public void actionPerformed(ActionEvent e) { 

    MainClass.inBattle = true; 
} 
} 

и вот мой метод showMainGui()

public static void showMainGui(){ 
    gui.panel.add(gui.healthLabel); 
    gui.panel.add(gui.pbsLabel); 
    gui.panel.add(gui.staminaLabel); 
    gui.panel.add(gui.levelLabel); 

    //Adding initial buttons 
    gui.panel.add(gui.exploreButton); 
    gui.panel.add(gui.huntButton); 
    gui.panel.add(gui.newsLabel); 
    gui.panel.add(gui.effectLabel); 
    updateGui(); 

} 
+0

вы можете представить некоторые более код? где вы меняете inBattel и как + showMainGUI метод – Tala

+0

Хорошо добавлено Tala –

+0

К сожалению, showMainGUI не дает нам никакой информации. Возможно, updateGUI может ... – Tala

ответ

8

Вы можете подождать, поставив нить спать.

while(inBattle == false){ 
    try { 
     Thread.sleep(200); 
    } catch(InterruptedException e) { 
    } 
} 
// perform operations when inBattle is true 

Также не забудьте сделать inBattle volatile

+0

Я пробовал метод сна, не работал для меня, но я попробую его точно так же, как у вас есть. Не могли бы вы объяснить неустойчивость? Я еще не узнал, что –

+0

Ваш графический интерфейс выполняется в другом потоке, Главный поток должен ждать, иначе он завершит выполнение и завершение. эта переменная inbattle является общей переменной, с помощью которой вы делаете свою синхронизацию. – Tala

+0

Спасибо, я понимаю это сейчас, но как я могу сделать переменную изменчивой? –

3

Я бы +1 Peters answer, но я чувствую это нуждается в некоторой разработке.

Существует абсолютно не требуется цикл while или дополнительная резьба. Просто добавьте слушателей к своим компонентам пользовательского интерфейса. Вот очень простой пример:

JButton button = new JButton("This is a button!"); 

    //Add action listener to button 
    button.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) 
    { 
     //Perform function when button is pressed 
     System.out.println("You clicked the button"); 
    } 
}); 

Вы добавили слушатель действия в то же время сохраняя время цикла, то почему? УДАЛИТЕ цикл while и используйте прослушиватель.

Повтор Peter еще раз, но RTFM. Просто read the documentation, который содержит четкие примеры. Нет никакой веской причины использовать этот цикл.


Ваше приложение не врезаться, он делает именно то, что вы говорите это сделать:

public static void main(String[] args){ 
    showMainGui(); 
    while(inBattle == false){ 
     // wait until inBattle changes 
    } 
} 

Вы хотите сказать, что, ПОКА inBattle ложно, ничего не делать, но если inBattle верно , ничего не предпринимайте, чтобы завершить основную функцию. Что вы ожидаете от нее после нажатия кнопки, если ничего не поделаешь?

+0

У меня уже есть кнопка с прослушивателем действий, созданным в моей функции showMainGui(). Когда я использую свою кнопку, она сбрасывает приложение –

+1

. Пожалуйста, снова прочтите мой оригинальный ответ, он обновлен. – snh

0

Я искал решение этого при чтении этого ответа, но я понял, что это может помочь вам, если вы пытаетесь помочь обновить свой gui.

Я предполагаю, что вы используете JPanels и прочее (я), но вы должны попробовать это:

В моей игре:

MainWindow window = new MainWindow(); 
    WelcomePanel welcome = new WelcomePanel(window); 
    window.add(welcome); 
    window.setVisible(true); 

    while (Data.isWelcomeConfigDone != true) { 
     try { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) {} 

    } 
    window.validate(); 
    window.setVisible(false); 
    window.remove(welcome); 

    GamePanel game = new GamePanel(window, welcome); 

    window.add(game); 
    window.setVisible(true); 
    game.setVisible(true); 

    while (true) {} 

Я была такая же идея, как вы, просто сделайте цикл, пока мое условие не станет ложным. Тем не менее, я чувствую, что парень не обновляет, поэтому вам нужно добавить следующее:

window.validate(); // or whatever it is. My window is a JFrame, 
         but it should work in a JPanel 

Я знаю, что это очень поздно, но для того, кто выскакивает в этом вопросе, то это должно надеяться, поможет.

validate() документ:

общественного недействительными Validate() Подтверждает этот контейнер и все его подкомпоненты. Метод проверки используется для того, чтобы контейнер снова выложил свои подкомпоненты. Он должен вызываться, когда подкомпоненты этого контейнера изменяются (добавляются или удаляются из контейнера или изменяются сведения о компоновке) после отображения контейнера.

Если этот Контейнер недействителен, этот метод вызывает метод validateTree и помечает этот контейнер как действительный. В противном случае никакие действия не выполняются.

: Overrides Validate в классе Component Смотрите также: добавить (java.awt.Component), Component.invalidate(), JComponent.revalidate(), validateTree()

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