【问题标题】:Stuck in loop with JOptionPane与 JOptionPane 陷入循环
【发布时间】:2019-11-30 12:56:24
【问题描述】:

我不确定 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,因为它是通过调用optionPane1.getInputValue().toString();得到的,toString()永远不会返回null。您的 JOptionPanel 构造函数调用也是错误的。阅读它的 javadoc:docs.oracle.com/javase/8/docs/api/javax/swing/…。第二个参数不能是 OK_OPTION。一般来说,你应该使用 JOptionPane 的静态 showXxx 方法来显示一个。
  • 如果你的getInputValue()返回null,你的代码会因为你调用toString()而崩溃,导致像null.toString()这样的情况产生NPE
  • 可能,检查这个answer,以获得更好的方法。

标签: java swing


【解决方案1】:

你可以用这个替换你所有的代码

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
}

【讨论】:

  • 我从来没有考虑过一段时间。优秀而简洁的答案。
【解决方案2】:

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

if (optionPane2.getInputValue() == null) {
   gamePaused = true;
   break;
}

【讨论】:

  • optionPane2 但是不返回 null。它将返回 "uninitializedValue" 。这个条件在这里没有意义。
  • 这并没有让我脱离 while 循环,它只是脱离了 if 语句。
  • @Luke break 用于退出循环,而不是 if 条件。 “它只打破了 is 语句”没有意义。
  • 没错,但中断通常是逻辑错误的标志。在这种特定情况下,没有任何帮助。不过,我很感谢你的建议。
【解决方案3】:

在您的 while 循环中,检查用户是否选择了取消: 在 while 循环中添加:

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

【讨论】:

  • 这也不会让我脱离内循环。即使可以,它也会尝试使用 name 的值 2 来执行操作。除非名称是字符串,否则我需要它不要尝试执行操作。
  • @Luke 字符串名称不必为“2”,getValue() 返回选定选项的值,即“1”用于按下“确定”,“2”用于按下“取消”。我只是比较一下,知道按下的是哪个按钮。
猜你喜欢
  • 2010-11-09
  • 1970-01-01
  • 2021-12-13
  • 2019-11-12
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 2011-06-21
相关资源
最近更新 更多