Java 与JOptionPane卡在循环中

Java 与JOptionPane卡在循环中,java,swing,Java,Swing,我不确定JOptionPanes的最佳实践,尽管这同样可能只是一个逻辑问题。我想要一个输入框,要求一个名字,检查它是一个字母只字符串,用户可以取消 我知道取消JOptionPane会导致返回null,这是我一开始就实现的。问题是,如果用户在第一个窗格中输入错误,则无法从第二个窗格中取消 编辑:值得指出的是,如果用户取消,我不想对这个名字做任何事情。这就是迫使我进入循环的问题。逻辑应该是检查用户输入;如果==2,则什么也不做。如果是其他的东西,验证是一个词并使用它。如果无效,则循环。问题是用户可以

我不确定JOptionPanes的最佳实践,尽管这同样可能只是一个逻辑问题。我想要一个输入框,要求一个名字,检查它是一个字母只字符串,用户可以取消

我知道取消JOptionPane会导致返回null,这是我一开始就实现的。问题是,如果用户在第一个窗格中输入错误,则无法从第二个窗格中取消

编辑:值得指出的是,如果用户取消,我不想对这个名字做任何事情。这就是迫使我进入循环的问题。逻辑应该是检查用户输入;如果==2,则什么也不做。如果是其他的东西,验证是一个词并使用它。如果无效,则循环。问题是用户可以稍后取消,并且使用名称的操作仍然会被执行,因为它位于第二个循环中,值为2

我目前有:

JOptionPane optionPane1 = new JOptionPane(text, OK_OPTION, CANCEL_OPTION);
optionPane1.setWantsInput(true);
JDialog d1 = optionPane1.createDialog(null);
d1.setVisible(true);
name = optionPane1.getInputValue().toString();

if(name == null){
   gamePaused = true;
}

else{
   while(!name.matches("^[a-zA-Z]+$") || name.length() == 0){
      JOptionPane optionPane2 = new JOptionPane("Please enter a word.\nTry again.", OK_OPTION, CANCEL_OPTION);
      optionPane2.setWantsInput(true);
      JDialog d2 = optionPane2.createDialog(null);
      d2.setVisible(true);

      name = optionPane2.getInputValue().toString();
   }
   ///use name
}

是否有更好的方法来执行此操作,以便允许用户取消并退出循环?

问题是,在
循环中,没有进一步检查用户是否按下了取消键(这意味着
name==null
)。一旦用户在第一次尝试中输入了无效的内容,他将停留在
while
循环中,并被一次又一次地询问他的姓名,直到有有效的输入,并且程序不再关心他是否单击了取消。因此,您需要在
name=optionPane2.getInputValue().toString()之前添加


问题在于,在
while
循环中,没有进一步检查用户是否按下了cancel(这意味着
name==null
)。一旦用户在第一次尝试中输入了无效的内容,他将停留在
while
循环中,并被一次又一次地询问他的姓名,直到有有效的输入,并且程序不再关心他是否单击了取消。因此,您需要在
name=optionPane2.getInputValue().toString()之前添加


在while循环中,检查用户是否选择了“取消”: 在while循环中添加以下内容:

if(optionPane2.getValue().toString().equals ("2")){ // 2 for close option in your case
        break;
}

在while循环中,检查用户是否选择了“取消”: 在while循环中添加以下内容:

if(optionPane2.getValue().toString().equals ("2")){ // 2 for close option in your case
        break;
}

您可以用此代码替换所有代码

do {
    name = JOptionPane.showInputDialog(null, "Enter name here : ", "title", JOptionPane.OK_CANCEL_OPTION);
} while(name != null && !name.matches("^[a-zA-Z]+$"));

if (name == null) {
    gamePaused = true;
} else {
    //Do whatever want with the name
}

您可以用此代码替换所有代码

do {
    name = JOptionPane.showInputDialog(null, "Enter name here : ", "title", JOptionPane.OK_CANCEL_OPTION);
} while(name != null && !name.matches("^[a-zA-Z]+$"));

if (name == null) {
    gamePaused = true;
} else {
    //Do whatever want with the name
}

名称不能为null,因为它是通过调用
optionPane1.getInputValue().toString()获得的
toString()
将永远不会返回null。您的JOptionPanel构造函数调用也错误。阅读它的javadoc:。第二个参数不能是OK\u选项。一般来说,您应该使用JOptionPane的静态showXxx方法来显示一个。如果您的
getInputValue()
返回
null
,您的代码将崩溃,因为您在其上调用
toString()
,导致出现类似于
null.toString()
的情况,从而产生
NPE
。可能的话,请检查这一点,为了获得更好的方法,name不可能为null,因为它是通过调用
optionPane1.getInputValue().toString()获得的
toString()
将永远不会返回null。您的JOptionPanel构造函数调用也错误。阅读它的javadoc:。第二个参数不能是OK\u选项。一般来说,您应该使用JOptionPane的静态showXxx方法来显示一个。如果您的
getInputValue()
返回
null
,您的代码将崩溃,因为您在其上调用
toString()
,导致出现类似于
null.toString()
的情况,从而产生
NPE
。可能的话,请检查这一点,为了获得更好的方法,optionPane2不会返回null。它将返回“uninitializedValue”。这个条件在这里没有意义。但这并没有使我脱离while循环,它只是脱离if语句。@Luke break用于脱离循环,而不是if条件。“它只是从is语句中中断”毫无意义。没错,但中断通常是逻辑错误的标志。在这种特殊情况下,没有任何帮助。尽管如此,我还是很感激你的建议。不过optionPane2不会返回null。它将返回“uninitializedValue”。这个条件在这里没有意义。但这并没有使我脱离while循环,它只是脱离if语句。@Luke break用于脱离循环,而不是if条件。“它只是从is语句中中断”毫无意义。没错,但中断通常是逻辑错误的标志。在这种特殊情况下,没有任何帮助。不过,我很感激你的建议。这也不会让我脱离内环。即使可以,它也会尝试使用name的值2来执行操作。除非名称是字符串,否则我不需要它来尝试操作。@字符串名称不需要是“2”,getValue()返回所选选项的值,即“1”表示按“确定”,而“2”表示按“取消”。我只是比较一下,看看哪个按钮被按下了。这也不会让我脱离内部循环。即使可以,它也会尝试使用name的值2来执行操作。除非名称是字符串,否则我不需要它来尝试操作。@字符串名称不需要是“2”,getValue()返回所选选项的值,即“1”表示按“确定”,而“2”表示按“取消”。我只是比较一下,想知道按下了哪个按钮。我一段时间都没想过要做什么。回答得很好,很简洁。我从来没想过要做什么。精练的回答。