我是Java的初学者,我遇到了一些问题。我正在使用JOPtionPane向用户询问一些问题。但是,我的困难来自这样一个事实,即当用户点击X或取消程序中的任何位置时,我不知道如何正确处理异常。此外,当我查看Java API并看到如何实现标题时,我尝试了它,但现在应该将标题放在文本字段中。
从程序的其他部分退出也会在主线程中产生异常,所以我希望能够捕获这些异常并退出而不是出错。此外,在inputdialogs中,标题“Investment Advisor”显示在文本字段内。我看过API,看起来我使用的是正确的形式,但显然不是。带有inputdialogs的图标也是如此。我不希望它们显示,但程序没有编译,并说如果我把它们放在inputdialogs中就找不到符号。它适用于optiondialog。
以上是在问题解决之前
非常感谢那些花时间阅读此内容的人。
以下是代码(注意,投资1和投资2只是具有适当公式的简单静态方法):
以下编辑;只是试图为错误的字符串添加错误检查
public static void main(String[] args)
{
String initialAmt_Str, targetAmt_Str, interestPct_Str, years_Str, result;
double principle = 0, target = 0, interest = 0;
int again = JOptionPane.NO_OPTION, time = 0;
NumberFormat fmt = NumberFormat.getCurrencyInstance();
do {
Object[] options = {"Compute years to reach target amount",
"Compute target amount given number of years"};
int choice = JOptionPane.showOptionDialog(null, "Please choose what you would like to do.",
"Investment Advisor", JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE, null, options, null);
if (choice != JOptionPane.CANCEL_OPTION)
{
if (choice == 1)
{
initialAmt_Str = JOptionPane.showInputDialog (null, "Enter the principle:", "Investment Advisor",
JOptionPane.PLAIN_MESSAGE);
if (initialAmt_Str != null)
principle = Double.parseDouble(initialAmt_Str);
else
System.exit(0);
interestPct_Str = JOptionPane.showInputDialog (null, "Enter the interest rate as a"
+ " percentage (without the percent sign):", "Investment Advisor", JOptionPane.PLAIN_MESSAGE);
if (interestPct_Str != null)
interest = Double.parseDouble(interestPct_Str);
else
System.exit(0);
years_Str = JOptionPane.showInputDialog (null, "Enter the amount of years:", "Investment Advisor",
JOptionPane.PLAIN_MESSAGE);
if (years_Str != null)
time = Integer.parseInt(years_Str);
else
System.exit(0);
result = "Your target amount given the number of years is " +
fmt.format(investment2(principle, interest, time)) + ".";
JOptionPane.showMessageDialog (null, result, "Investment Advisor", JOptionPane.PLAIN_MESSAGE);
again = JOptionPane.YES_OPTION;
}
}
else
again = JOptionPane.NO_OPTION;
if (choice == 0)
{
initialAmt_Str = JOptionPane.showInputDialog (null,"Enter the principle:","Investment Advisor",
JOptionPane.PLAIN_MESSAGE);
if (initialAmt_Str != null)
principle = Double.parseDouble(initialAmt_Str);
else
System.exit(0);
interestPct_Str = JOptionPane.showInputDialog (null, "Enter the interest rate as a"
+ " percentage (without the percent sign):", "Investment Advisor", JOptionPane.PLAIN_MESSAGE);
if (interestPct_Str != null)
interest = Double.parseDouble(interestPct_Str);
else
System.exit(0);
targetAmt_Str = JOptionPane.showInputDialog (null, "Enter your target amount:", "Investment Advisor",
JOptionPane.PLAIN_MESSAGE);
if (targetAmt_Str != null)
target = Double.parseDouble(targetAmt_Str);
else
System.exit(0);
result = "You will reach your target amount in " +
investment1(principle, target, interest) +
(investment1(principle, target, interest) == 1 ? " year." : " years.");
JOptionPane.showMessageDialog (null, result, "Investment Advisor", JOptionPane.PLAIN_MESSAGE);
again = JOptionPane.YES_OPTION;
}
if (again != JOptionPane.NO_OPTION)
again = JOptionPane.showConfirmDialog(null, "Find Another?", "", JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE);
} while (again == JOptionPane.YES_OPTION);
}
答案 0 :(得分:2)
如果用户点击“x”关闭按钮JOptionPane
将返回JOptionPane.CLOSED_OPTION
你应该先检查一下......
if (choice != JOptionPane.CLOSED_OPTION) {
// Do the normal stuff
} else {
// Break out of the do loop
break;
}
您还应该注意,使用JOptionPane.showOptionDialog
的方式,JOptionPane
将返回用户选择的选项的索引。
这意味着返回值0
表示用户选择了"Compute years to reach target"
,返回值为1
表示用户选择了"Compute target given number of years"
使用JOptionPane.NO_OPTION
或JOptionPane.YES_OPTION
可能无法实现您期望的结果......
更新了示例
你的重组允许稍微“偷偷摸摸”的选项,而不是使用break,当用户关闭选项对话框时,我简单地将again
变量设置为JOptionPane.NO_OPTION
...
public static void main(String[] args) {
String initialAmt_Str, targetAmt_Str, interestPct_Str, years_Str, result;
double principle, target, interest;
int again, time;
NumberFormat fmt = NumberFormat.getCurrencyInstance();
do {
Object[] options = {"Compute years to reach target",
"Compute target given number of years"};
int choice = JOptionPane.showOptionDialog(null, "Please choose what you would like to do.",
"Investment Advisor", JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE, null, options, null);
if (choice != JOptionPane.CANCEL_OPTION) {
if (choice == 1) {
JOptionPane.showMessageDialog(null, "Compute target given number of years");
} else if (choice == 0) {
JOptionPane.showMessageDialog(null, "Compute years to reach target");
}
again = JOptionPane.showConfirmDialog(null, "Find Another?");
} else {
again = JOptionPane.NO_OPTION;
}
} while (again == JOptionPane.YES_OPTION);
}
更新了处理已取消输入的其他示例
因此,如果用户单击输入对话框中的“x”按钮,它们将返回null
。此时,您需要检查null
结果并选择有关如何处理它的方法。在下面的示例中,我只是将again
设置为等于JOptionPane.NO_OPTION
public static void main(String[] args) {
String initialAmt_Str, targetAmt_Str, interestPct_Str, years_Str, result;
double principle, target, interest;
int again, time;
NumberFormat fmt = NumberFormat.getCurrencyInstance();
do {
Object[] options = {"Compute years to reach target",
"Compute target given number of years"};
int choice = JOptionPane.showOptionDialog(null, "Please choose what you would like to do.",
"Investment Advisor", JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE, null, options, null);
if (choice != JOptionPane.CANCEL_OPTION) {
again = JOptionPane.YES_OPTION;
if (choice == 1) {
String input = JOptionPane.showInputDialog("Enter the principle:", "Investment Advisor");
if (input != null) {
// Process further...
System.out.println("Continue processing...");
} else {
again = JOptionPane.NO_OPTION;
}
} else if (choice == 0) {
String input = JOptionPane.showInputDialog("Enter your target amount:", "Investment Advisor");
if (input != null) {
// Process further...
System.out.println("Continue processing...");
} else {
again = JOptionPane.NO_OPTION;
}
}
if (again != JOptionPane.NO_OPTION) {
again = JOptionPane.showConfirmDialog(null, "Find Another?");
}
} else {
again = JOptionPane.NO_OPTION;
}
} while (again == JOptionPane.YES_OPTION);
}