Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待按钮按下按钮按钮_Java_Swing_Jpanel_Actionlistener_Jlabel - Fatal编程技术网

Java 等待按钮按下按钮按钮

Java 等待按钮按下按钮按钮,java,swing,jpanel,actionlistener,jlabel,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

我正在寻找一种方法,使我的程序等待,直到一个按钮被按下,以继续功能。在我的主函数中,我调用了一个函数,该函数使用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()上创建的按钮的我的操作侦听器

下面是我的showMainGui()方法


您可以通过使线程休眠来等待

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

另外,不要忘记在按钮中添加一个监听器,并在监听器中进行更改

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

重复一遍,但是。只是,这提供了明确的例子。没有充分的理由使用这个循环


您的应用程序没有崩溃,它正按照您的要求执行:

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

你的意思是,虽然inBattle为false,但什么也不做,但如果inBattle为true,则什么也不做,然后结束主函数--如果没有什么要做的,你希望它在单击按钮后做什么?

阅读此答案时,我一直在寻找解决方案,但我意识到,如果您试图帮助更新gui,这可能会对您有所帮助

我假设您正在使用JPanel和其他东西(我是),但您应该尝试以下方法:

在我的游戏中:

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

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

覆盖: 类内验证组件 另见: 添加(java.awt.Component)、Component.invalidate()、JComponent.revalidate()、validateTree()


上面的答案并没有回答我对这个问题的看法,所以我尝试了另一个解决方案。当我搜索“等待按钮按下jbutton”时,这是第一个答案

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

public void actionPerformed(ActionEvent e){
buttonClicked=true;
已同步(b){
b、 通知();
} 
} 
(很抱歉缩进,如果有人想编辑,请继续)单击按钮时会发送通知。然后我附加了一个名为waitForEnter()的方法:

public static void waitForEnter()抛出InterruptedException{
已同步(b){
试一试{
b、 等待();
}捕获(中断异常例外){
系统输出打印项次(“中断”);
}
}
System.out.println(“单击按钮后”);
//…更多代码
}

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

我已经尝试过睡眠方法,但似乎对我不起作用,但我会完全按照你的方法来尝试。你能解释一下吗?我还没有了解到您的GUI正在另一个线程上执行,主线程应该等待,否则它将完成执行并终止。这个inbattle变量是一个共享变量,您可以通过它进行同步。谢谢,我现在明白了,但是我如何使该变量变为volatile?只需将volatile添加到声明
public static volatile boolean inbattle=false我已经这样做了,但似乎没有改变。如果我要从main方法添加按钮,而不是调用一个将项目添加到实例中的函数,那么这样做行吗?我已经在showMainGui()函数中创建了一个带有操作侦听器的按钮。当我使用我的按钮时,它会使应用程序崩溃。你能再提供一些代码吗?更改电池的位置和方式+showMainGUI方法抱歉,showMainGUI未提供任何信息。也许updateGUI可以…updateGUI所做的就是将标签文本设置为变量。那么什么是调用setVisible方法?new Gui()?是的,setVisible在Gui实例中
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