【发布时间】: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,以获得更好的方法。