Java 等待按钮按下按钮按钮
我正在寻找一种方法,使我的程序等待,直到一个按钮被按下,以继续功能。在我的主函数中,我调用了一个函数,该函数使用JPanel、按钮和标签显示我的基本GUI。当然,它显示了GUI并结束了不允许我修改GUI的功能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
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