Java 选择“否”后,showInputDialog显示次数过多

Java 选择“否”后,showInputDialog显示次数过多,java,Java,如果字符串确认输入不是“Y”或“Y”,我希望Play()再次运行。当我按下war按钮时,它显示输入对话框,如果我输入“N”,它将按预期运行。但是,如果我在同一程序运行中按下任何按钮并再次输入“N”,它将要求确认2次。如果我再做一次,它会要求确认4次,并以2的幂继续这个模式。是什么原因造成的,有没有更好的方法来确认用户的选择 就在它再次运行play()之前,我尝试在else{}中将字符串confirm设置为等于“”,但它不起作用,而且我也不希望起作用。但除此之外,我不知道 公共班机{ public

如果字符串确认输入不是“Y”或“Y”,我希望Play()再次运行。当我按下war按钮时,它显示输入对话框,如果我输入“N”,它将按预期运行。但是,如果我在同一程序运行中按下任何按钮并再次输入“N”,它将要求确认2次。如果我再做一次,它会要求确认4次,并以2的幂继续这个模式。是什么原因造成的,有没有更好的方法来确认用户的选择

就在它再次运行play()之前,我尝试在else{}中将字符串confirm设置为等于“”,但它不起作用,而且我也不希望起作用。但除此之外,我不知道

公共班机{

public static void main(String[] args) {
    GUI heroSelect = new GUI(450, 200, "Inscription", new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    JLabel heroLabel = new JLabel("Choose your class, hero.");
    heroLabel.setFont(new Font("Serif", Font.PLAIN, 22));
    c.gridx = 1;
    c.gridy = 0;
    c.weightx = .5;
    c.weighty = .5;
    heroSelect.add(heroLabel, c);

    JButton war = new JButton("Warrior");
    c.gridx = 0;
    c.gridy = 2;
    heroSelect.add(war, c);

    JButton mage = new JButton("Mage");
    c.gridx = 1;
    c.gridy = 2;
    heroSelect.add(mage, c);

    JButton rog = new JButton("Rogue");
    c.gridx = 2;
    c.gridy = 2;
    heroSelect.add(rog, c);

    play(war, mage, rog);

}

public static void play(JButton war, JButton mage, JButton rog) {
    war.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String confirm = JOptionPane.showInputDialog(null, "The warrior "
                    + "is a strong, hard-hitting class. It relies on raw "
                    + "damage and heals through offensive abilities.\n "
                    + "However, the warior does not possess any direct "
                    + "healing or spells. Are you sure you want to choose "
                    + "this class? Y/N");
            if(confirm.equalsIgnoreCase("Y")) {
                //TBD
            }
            else {
                play(war, mage, rog);
            }
        }

    });

    mage.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String confirm = JOptionPane.showInputDialog(null, "");//ADD DESCRIP
            if(confirm.equalsIgnoreCase("Y")) {

            }
            else {
                play(war, mage, rog);
            }
        }

    });

    rog.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String confirm = JOptionPane.showInputDialog(null, "");//ADD DESCRIP
            if(confirm.equalsIgnoreCase("Y")) {

            }
            else {
                play(war, mage, rog);
            }
        }

    });
}
}


当用户输入“N”或“N”时,showInputDialog应关闭,并应重新运行play(),以允许用户查看其他类的描述并最终选择一个。相反,输入“N”或除“Y”或“Y”之外的任何内容都会导致多个showInputDialog背靠背提示。

通过在其内部调用play()方法所做的操作称为递归,每次调用它时,都会向按钮添加更多的EventListener

我认为重复检查输入的do-while循环代替if-else对您有效

do {
    String confirm = ...
    ....
    if(confirm.equalsIgnoreCase("N")) {
        break;
    }
} while (!confirm.equalsIgnoreCase("Y"))

// Code to run game or whatever is next...

通过在其内部调用play()方法所做的工作称为递归,每次调用它时,都会向按钮添加更多的EventListener

我认为重复检查输入的do-while循环代替if-else对您有效

do {
    String confirm = ...
    ....
    if(confirm.equalsIgnoreCase("N")) {
        break;
    }
} while (!confirm.equalsIgnoreCase("Y"))

// Code to run game or whatever is next...

在Play方法中创建的侦听器中调用Play方法。每次你为每一位英雄做新的倾听者。 还可以阅读OOP(在java中使用对象比在初学者中使用GUI更重要:)

作为关于更好的方法的问题,我真的鼓励你熟悉模式。
仅仅收集输入是一件非常简单的事情,您可以有多种选择,例如循环开关盒。

您可以在Play方法中创建的侦听器中调用Play方法。每次你为每一位英雄做新的倾听者。 还可以阅读OOP(在java中使用对象比在初学者中使用GUI更重要:)

作为关于更好的方法的问题,我真的鼓励你熟悉模式。
收集输入非常简单,你有多种选择,比如循环开关盒。

每次调用method
play()
,你都在为每个按钮添加另一个
ActionListener
,每次调用method
play()
,你都会在按钮war、mage和rog上添加另一个
,您正在为每个按钮添加另一个
ActionListener
,war、mage和rog我会在中断之后还是之前为if添加代码;?你是说我上面代码中的if和break?其思想是,只有当用户输入“N”时,循环才会到达该断点。对于每一个其他输入,它将继续循环,直到用户输入“Y”,然后代码可以继续。我为if加了括号,以防这让你困惑哇,你真是天赐之物,我的朋友。谢谢你很乐意帮忙!!只是想谈谈m.s.提到的。如果你是新手,你应该更多地关注于学习面向对象的编程规则和范例。在你理解如何使用对象和数据结构之前,图形用户界面的东西和库等都可以放在次要位置;?你是说我上面代码中的if和break?其思想是,只有当用户输入“N”时,循环才会到达该断点。对于每一个其他输入,它将继续循环,直到用户输入“Y”,然后代码可以继续。我为if加了括号,以防这让你困惑哇,你真是天赐之物,我的朋友。谢谢你很乐意帮忙!!只是想谈谈m.s.提到的。如果你是新手,你应该更多地关注于学习面向对象的编程规则和范例。图形用户界面的东西和库等在你理解如何使用对象和数据结构之前都会退居次要地位。我能做些什么来解决这个问题,而不必重写整个过程?我可以在递归调用play方法时重用相同的侦听器吗?那么,我想说的是,您正在创建GUI Rogulelike/rpg游戏,甚至在开始时,您在主方法硬编码菜单中也遇到了一些问题,并且在处理玩家创建时遇到了一些问题。如果你继续走这条路,你肯定会迷失在这段代码中,或者被迫进行重构/重写。如果你现在就开始,事情会容易些。这是你的第一个更大的项目吗?我能做些什么来解决这个问题而不必重写整个项目?我可以在递归调用play方法时重用相同的侦听器吗?那么,我想说的是,您正在创建GUI Rogulelike/rpg游戏,甚至在开始时,您在主方法硬编码菜单中也遇到了一些问题,并且在处理玩家创建时遇到了一些问题。如果你继续走这条路,你肯定会迷失在这段代码中,或者被迫进行重构/重写。如果你现在就开始,事情会容易些。这是你的第一个更大的项目吗?