-1

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

我刚刚意识到根本不需要使用循环。设置 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;
    }

(“设置按钮”:)

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;
    }
}

(“战斗监听器”:)

class CombatListener implements ActionListener{

    int but_num;

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

}

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

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

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

我希望所有这些都是有道理的...... :)

4

2 回答 2

2

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

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

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

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

于 2012-11-27T15:36:13.373 回答
0

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

void actionPerformed(ActionEvent e) {
    btn1.setVisible(true);
    btn2.setVisible(true);
    btn3.setVisible(false);
    }
}
于 2012-11-27T15:36:09.957 回答