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

8

您可以通过使线程进入睡眠状态来等待。

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

也不要忘记让 inBattle 变得易变

于 2013-08-01T09:09:16.027 回答
5

我会 +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 循环并使用侦听器。

再次重复彼得,但RTFM。只需阅读文档,其中提供了清晰的示例。没有充分的理由使用该循环。


您的应用程序没有崩溃,它正在按照您的要求进行操作:

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

你是说,WHILE inBattle 为假,什么也不做,但如果 inBattle 为真,什么都不做,然后结束 main 函数——如果没有什么可做的,点击按钮后你期望它做什么?

于 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() 验证此容器及其所有子组件。validate 方法用于使容器重新布置其子组件。在容器显示后修改此容器的子组件(添加到容器或从容器中删除,或更改布局相关信息)时,应调用它。

如果此 Container 无效,则此方法调用 validateTree 方法并将此 Container 标记为有效。否则,不执行任何操作。

覆盖:在类 Component 中验证 另请参见:add(java.awt.Component)、Component.invalidate()、JComponent.revalidate()、validateTree()

于 2015-04-20T01:56:11.283 回答
0

上面的答案没有回答我的问题版本,所以我修改了另一个解决方案。当我搜索“等待按钮按下 jbutton”时,这是第一个答案。

我的解决方案有效,它使用了等待通知的概念。我在按钮上附加了一个 ActionListener:

    public void actionPerformed(ActionEvent e) { 
             buttonClicked = true;
             synchronized (b) {
                 b.notify();
                 
             } 
    } 

(抱歉缩进,如果有人想编辑,请继续)单击按钮时会发送通知。然后我附加了一个名为 waitForEnter() 的方法:

public static void waitForEnter() throws InterruptedException {
        synchronized(b) {
            try {
                
                b.wait();
            } catch (InterruptedException ex) {
                System.out.println("Interrupted");
            }
        }
        System.out.println("After button clicked");
    //... more code
    }

当我调用这个方法时,它会暂停主线程的执行,直到单击名为“b”的按钮。这对我来说效果很好。

于 2020-12-31T02:20:30.980 回答