3

ボタンを押して機能を続行するまでプログラムを待機させる方法を探しています。メイン関数では、JPanel、ボタン、およびラベルを使用して基本的な GUI を表示する関数を呼び出しています。もちろん、それはGUIを表示し、その機能を終了してGUIを変更できないようにします。

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

while ループはループし、showMainGui で作成されたボタンが inBattle で true に変わるまで待機します。どうすれば正確にこれを行うことができますか? これはかなり混乱しています。私の目標は、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();

}
4

5 に答える 5

5

Peters answerを +1しますが、これにはもう少し詳しく説明する必要があると思います。

while ループや追加のスレッドはまったく必要ありません。UI コンポーネントにリスナーを追加するだけです。非常に簡単な例を次に示します。

    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 ループを維持したままアクション リスナーを追加しましたが、なぜですか? while ループを削除し、リスナーを使用します。

Peterをもう一度繰り返しますが、 RTFM . 明確な例を提供するドキュメントを読むだけです。そのループを使用する正当な理由はありません。


あなたのアプリケーションはクラッシュしていません。あなたが指示したことを正確に実行しています:

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

inBattle が false の間は何もしないが、inBattle が true の場合は何もせずにメイン関数を終了すると言っています。

于 2013-08-01T09:17:06.443 に答える
1

ボタンにリスナーを追加し、リスナーを変更します

http://docs.oracle.com/javase/tutorial/uiswing/events/index.html

于 2013-08-01T09:13:06.707 に答える
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()ドキュメント:

public void validate() このコンテナーとそのすべてのサブコンポーネントを検証します。検証メソッドは、コンテナにそのサブコンポーネントを再度レイアウトさせるために使用されます。コンテナーが表示された後に、このコンテナーのサブコンポーネントが変更された (コンテナーに追加またはコンテナーから削除された、またはレイアウト関連の情報が変更された) 場合に呼び出す必要があります。

この Container が有効でない場合、このメソッドは validateTree メソッドを呼び出し、この Container を有効としてマークします。それ以外の場合、アクションは実行されません。

オーバーライド: クラス Component での検証 関連項目: add(java.awt.Component)、Component.invalidate()、JComponent.revalidate()、validateTree()

于 2015-04-20T01:56:11.283 に答える