我正在寻找一种方法让我的程序等到按下按钮继续该功能。在我的主要功能中,我调用的功能是使用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();
}
答案 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”的按钮。这对我来说非常有效。