【问题标题】:(Java Swing GUI) How to make methods wait for input from buttons? [closed](Java Swing GUI)如何让方法等待按钮输入? [关闭]
【发布时间】:2012-11-15 06:12:49
【问题描述】:

编辑:不要介意我所说的一切!!!

我刚刚意识到根本不需要使用循环。设置 GUI 的每个方法都在完成后立即结束,整个程序“等待”我在此之后按下按钮。我只需要设置方法,因此如有必要,它们可以“循环”。

我不确定我的解释是否正确,但我认为它会起作用。无论如何感谢您的帮助!

为了安全起见,再问一个问题:当我在“main()”方法中设置主窗口时,程序只有在达到我设置的特定条件时才会退出(即玩家死亡),并且不会自行“结束”?


好的,这是我的问题:

我正在开发一个非常原始的 RPG,它使用 Swing 作为其 GUI。因为这意味着我需要大量的方法来让它工作,并且我需要用少量的按钮来控制一切(为了简单起见),我决定只使用一组按钮,并创建几个不同的 ActionListener .当调用某个方法时,它通过将必要数量的按钮设置为“可见”、设置其文本并为它们分配正确的 ActionListener 来设置 GUI。

这是一个例子(玩家与一个 NPC 战斗):

public int Combat(NPC e){
    game.setButtons(0, true, "Attack", 1);
    game.setButtons(1, true, "Ability", 1);
    game.setButtons(2, false, "", 1);
    game.setButtons(3, false, "", 1);
    game.setButtons(4, false, "", 1);
    game.setButtons(5, true, "Flee", 5);

    while(e.gethp() > 0 && this.hp > 0){
        if (!game.getProceed())
            break;

    }
    if (e.gethp() <= 0)
        return 1;
    else if(hp <= 0)
        return 2;
    else return 3;
    }

("setButtons":)

public void setButtons(int b, boolean v, String s, int act){
    button[b].setVisible(v);
    button[b].setText(s);
    switch(act){
        case 1: button[b].addActionListener(comlist[b]); break;
        case 2: button[b].addActionListener(maplist[b]); break;
        case 3: button[b].addActionListener(loclist[b]); break;
        case 4: button[b].addActionListener(invlist[b]); break;
        case 5: button[b].addActionListener(mainlist[b]); break;
        case 6: button[b].addActionListener(playlist[b]); break;
        case 7: button[b].addActionListener(intlist[b]); break;
        case 8: button[b].addActionListener(proc); break;
    }
}

(“CombatListener”:)

class CombatListener implements ActionListener{

    int but_num;

    public CombatListener(int n){
        but_num = n;
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        player.CombatAction(but_num);           
    }

}

(我设置的另一个侦听器是“继续”侦听器。这会将游戏中的布尔“继续”变量设置为 false。这里的想法是这将是我的“后退”按钮,这将让我得到从菜单返回到上一个菜单,或者在这种情况下:逃离战斗。这就是我在那个 while 循环中设置它的原因,但我不确定这是不是正确的做法。)

我不确定我应该为此提供多少代码才能有意义(整个事情非常庞大)。如有需要,我会全部发在这里。

我的问题:如何确保当我的程序进入“Combat”方法时,它能够在我使用按钮发出命令时停留在那里?这里的复杂之处在于,这些按钮通常会使程序进入一个额外的方法,这也可以以不同的方式设置 GUI,当这些方法完成时,需要“重置”GUI 才能使用以前的方法。

我希望所有这些都有意义... :)

【问题讨论】:

  • 对不起,我不明白问题出在哪里。您需要更清楚地解决问题。
  • @trashgod 它不会让我删除它...
  • 我的错;看到这个answer

标签: java swing user-interface button wait


【解决方案1】:

在 SWING 应用程序中,您无法控制所谓的“主循环”。

因此,在 SWING 应用程序中,您不会执行“等待用户输入、处理、循环”之类的操作。

SWING 应用程序是您喜欢的“事件驱动”或“状态机”。您必须设置事件处理程序来处理用户输入,然后,给定输入 X 或 Y,您的应用程序必须相应地发展其状态。

例如,假设一个回合制战斗游戏。在玩家移动期间,应用程序处于“玩家移动状态”,在敌人移动期间,应用程序处于“敌人移动状态”。在“玩家移动状态”中,应用程序将提供交互,然后对用户的选择做出反应,然后转换到“敌人移动状态”,然后发生其他事情等等。进入“玩家移动状态”之后,在用户输入之前没有方法活动,在读取或写入时没有循环阻塞。应用程序处于“空闲”状态,等待某个处理程序变为活动状态。

【讨论】:

    【解决方案2】:

    如果您的方法是通过按下按钮调用的,则将该事件发送到您的 ActionListener,您应该在其中设置条件以在触发该事件时显示所需的按钮。

    void actionPerformed(ActionEvent e) {
        btn1.setVisible(true);
        btn2.setVisible(true);
        btn3.setVisible(false);
        }
    }
    

    【讨论】:

    • 抱歉,按错按钮,没有发布所有内容。现在完整的“版本”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2016-09-29
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多