do {
number = (String)JOptionPane.showInputDialog(null,"Quantity : ","TRIAL",JOptionPane.QUESTION_MESSAGE);
if(number.matches("\\d+")) {
qty = Integer.parseInt(number);
}
// JOptionPane.showMessageDialog(null,"Invalid input !\n\nMin = 1\nMax = 100","TRIAL",JOptionPane.ERROR_MESSAGE);
} while(qty < 1 || qty > 100);
JOptionPane.showMessageDialog(null,number);
如果我将错误信息放在内部或外部,如果用户键入正确的数据,则仍会显示错误消息
答案 0 :(得分:1)
如果输入与正则表达式不匹配,则需要显示消息。所以这个:
if(number.matches("\\d+")){
qty = Integer.parseInt(number);
}
// JOptionPane.showMessageDialog(null,"Invalid input !\n\nMin = 1\nMax = 100","TRIAL",JOptionPane.ERROR_MESSAGE);
需要成为这个:
if(number.matches("\\d+")){
qty = Integer.parseInt(number);
} else {
JOptionPane.showMessageDialog(null,"Invalid input !\n\nMin = 1\nMax = 100","TRIAL",JOptionPane.ERROR_MESSAGE);
}
现在你说如果匹配好,那么你会看到qty
的新值,但是如果它没有,那么你就会显示消息。
您可能会考虑另一种方法,即避免使用正则表达式,但只需尝试parseInt()
调用,然后捕获无法转换的NumberFormatException
结果。
(如果可以解析数字,还需要一些逻辑来显示错误,但是在1到100的有效范围之外给出结果。)
答案 1 :(得分:1)
您可以将条件检查移动到循环中并将循环更改为无限:
while (true) {
number = (String)JOptionPane.showInputDialog(null,"Quantity : ","TRIAL",JOptionPane.QUESTION_MESSAGE);
if(number.matches("[1-9]\\d*")){
qty = Integer.parseInt(number);
if (qty >= 1 && qty <= 100) {
break;
}
}
JOptionPane.showMessageDialog(null, "Invalid input !\n\nMin = 1\nMax = 100", "TRIAL", JOptionPane.ERROR_MESSAGE);
}
JOptionPane.showMessageDialog(null,number);
在这种情况下,你有一个无限循环,只有当输入的值只包含数字并且它的值在[1,100]
范围内时才会中断答案 2 :(得分:1)
如果用户输入错误的数字数据,如何调用错误消息
我建议为他们提供一个控件,这样可以轻松选择一个数字。具体来说,是一个带有微调数模型的微调器。像这样:
import javax.swing.*;
public class PickANumber {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
SpinnerNumberModel spinnerModel =
new SpinnerNumberModel(0, 0, 100, 1);
JSpinner spinner = new JSpinner(spinnerModel);
while (spinnerModel.getNumber().intValue()<1) {
JOptionPane.showMessageDialog(
null,
spinner,
"Pick a number between 1 & 100!",
JOptionPane.QUESTION_MESSAGE);
}
System.out.println(
"Number: " + spinnerModel.getNumber().intValue());
}
};
SwingUtilities.invokeLater(r);
}
}