等待按钮按JButton

时间:2013-08-01 09:06:04

标签: java swing jpanel actionlistener jlabel

我正在寻找一种方法让我的程序等到按下按钮继续该功能。在我的主要功能中,我调用的功能是使用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();

}

5 个答案:

答案 0 :(得分:8)

您可以等待线程进入睡眠状态。

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

另外不要忘记制作inBattle volatile

答案 1 :(得分:5)

我会+1 Peters answer,但我觉得这需要一些细化。

绝对不需要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。只需read the documentation,它提供了明确的示例。没有充分的理由使用该循环。


您的应用程序没有崩溃,它正在执行您要告诉它的操作:

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

你说,WHILE inBattle是假的,什么也不做,但是如果inBattle是真的,什么也不做就结束主要功能 - 如果没有什么可以做的话,你在点击按钮后会发生什么呢?

答案 2 :(得分:1)

为您的按钮添加一个监听器并更改监听器

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

答案 3 :(得分: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() doc:

  

public void validate()   验证此容器及其所有子组件。   validate方法用于使容器再次布置其子组件。在容器显示后修改此容器的子组件(添加到容器中或从容器中删除,或更改布局相关信息)时,应调用它。

     

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

     

覆盖:   在类Component中验证   也可以看看:   add(java.awt.Component),Component.invalidate(),JComponent.revalidate(),validateTree()

答案 4 :(得分: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”的按钮。这对我来说非常有效。