2012-11-27 30 views
-1

編輯:從來沒有想過我說的一切!(Java Swing GUI)如何使方法等待來自按鈕的輸入?

我剛剛意識到沒有必要使用循環。設置GUI的每種方法在完成後立即結束,並且整個程序「等待」我以後再按下一個按鈕。我只需要設置方法,如果有必要,他們可以「循環」。

我不確定我是否正確解釋,但我認爲它會起作用。無論如何感謝您的幫助!要保證安全:當我在「main()」方法中設置主窗口時,如果程序遇到了我設置的特定條件(即玩家死),並不會自行「結束」?


好了,這裏是我的問題:

我的工作是使用Swing作爲圖形用戶界面非常原始的RPG。因爲這意味着我需要大量的方法來使它工作,並且我需要用少量的按鈕來控制每一件事(爲了簡單起見),我決定只使用一定數量的按鈕,並創建幾個不同的ActionListeners 。當調用某個方法時,它通過將必要數量的按鈕設置爲「可見」,設置它們的文本以及爲它們分配正確的ActionListeners來設置GUI。

下面是一個例子(玩家戰鬥的NPC):

public int Combat(NPC e){ 
    game.setButtons(0, true, "Attack", 1); 
    game.setButtons(1, true, "Ability", 1); 
    game.setButtons(2, false, "", 1); 
    game.setButtons(3, false, "", 1); 
    game.setButtons(4, false, "", 1); 
    game.setButtons(5, true, "Flee", 5); 

    while(e.gethp() > 0 && this.hp > 0){ 
     if (!game.getProceed()) 
      break; 

    } 
    if (e.gethp() <= 0) 
     return 1; 
    else if(hp <= 0) 
     return 2; 
    else return 3; 
    } 

( 「setButtons」 :)

public void setButtons(int b, boolean v, String s, int act){ 
    button[b].setVisible(v); 
    button[b].setText(s); 
    switch(act){ 
     case 1: button[b].addActionListener(comlist[b]); break; 
     case 2: button[b].addActionListener(maplist[b]); break; 
     case 3: button[b].addActionListener(loclist[b]); break; 
     case 4: button[b].addActionListener(invlist[b]); break; 
     case 5: button[b].addActionListener(mainlist[b]); break; 
     case 6: button[b].addActionListener(playlist[b]); break; 
     case 7: button[b].addActionListener(intlist[b]); break; 
     case 8: button[b].addActionListener(proc); break; 
    } 
} 

(以下簡稱 「CombatListener」 :)

class CombatListener implements ActionListener{ 

    int but_num; 

    public CombatListener(int n){ 
     but_num = n; 
    } 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     player.CombatAction(but_num);   
    } 

} 

(我設置的另一個監聽器是「繼續」監聽器,它將遊戲中的布爾型「proceed」變量設置爲false。這裏的想法是成爲我的「後退」按鈕,這將允許我從菜單返回到前一個菜單,或者在這種情況下:退出戰鬥。這就是爲什麼我在while循環中設置它的原因,但我不確定這是否是正確的方式。)

我不知道我應該提供多少代碼來使它成爲任何一種感覺(整個事情是非常巨大的)。如有必要,我會在這裏發佈所有內容。

我的問題:我如何確保當我的程序進入「Combat」方法時,在使用按鈕給出命令時,它將能夠留在那裏?這裏的複雜之處在於,這些按鈕通常會讓程序輸入一個額外的方法,也可能以不同的方式設置GUI,並且當這些方法完成時,需要「重置」GUI以使用先前的方法。

我希望這一切有意義... :)

+0

對不起,我不明白是什麼問題。你需要更清楚的問題。 – cworner1

+0

@trashgod它不會讓我刪除它... – user1856971

+0

我的錯誤;看到這個[回答](http://meta.stackexchange.com/a/5222/163188)。 – trashgod

回答

0

如果你的方法是通過按下一個按鈕調用,發送事件到你的ActionListener,你應該已經確立了自己的條件,以顯示相應的按鈕時事件被觸發。

void actionPerformed(ActionEvent e) { 
    btn1.setVisible(true); 
    btn2.setVisible(true); 
    btn3.setVisible(false); 
    } 
} 
+0

對不起,按了錯誤的按鈕,沒有發佈一切。現在完整的「版本」 – user1856971

2

在你有過所謂的「主循環」無法控制的Swing應用程序。

因此,在SWING應用程序中,您不會執行諸如「等待用戶輸入,過程,循環」之類的操作。

SWING應用程序是「事件驅動」或「狀態機」,如你所願。您必須設置事件處理程序來處理用戶輸入,然後,在輸入X或Y的情況下,您的應用程序必須相應地演變其狀態。

例如,假設基於回合的戰鬥遊戲。在玩家移動的過程中,應用程序處於「玩家移動狀態」,在敵人移動時處於「敵人移動狀態」。在「玩家移動狀態」中,應用將提供交互,然後對用戶的選擇作出反應,而不是轉換到「敵方移動狀態」,然後發生其他事情等。進入「玩家移動狀態」之後並且在用戶輸入之前,沒有方法活動,在讀取或寫入時沒有環路阻塞。應用程序處於「空閒」狀態,等待某個處理程序變爲活動狀態。