简体   繁体   English

JOPtionPane遇到问题

[英]Having trouble with JOPtionPane

I'm a beginner to Java and I'm having some difficulty with a problem. 我是Java的初学者,遇到一些困难。 I am using JOPtionPane to ask the user some questions. 我正在使用JOPtionPane询问用户一些问题。 However, my difficulties are coming from the fact that I don't know how to handle exceptions properly when the user clicks the X or cancel anywhere in the program. 但是,我的困难来自于这样一个事实:当用户单击X或取消程序中的任何位置时,我不知道如何正确处理异常。 Also, when I looked at the Java API and saw how to implement titles, I tried it but now what should be titles are being placed in the text field instead. 另外,当我查看Java API并了解如何实现标题时,我尝试了一下,但是现在应该在文本字段中放置标题。

Quitting from other parts of the program also yields exceptions in main thread so I would like to be able to catch those and exit gracefully instead of erroring. 从程序的其他部分退出也会在主线程中产生异常,因此我希望能够捕获这些异常并正常退出而不是出错。 Also, in the inputdialogs the title "Investment Advisor" is showing up inside the text field instead. 同样,在输入对话框中,标题“ Investment Advisor”将显示在文本字段内。 I have looked at the API and it seems I am using proper form but obviously not. 我看过API,看来我使用的是正确的格式,但显然没有。 Same thing for the icons with the inputdialogs. 具有输入对话框的图标也是如此。 I don't want them to show but the program doesn't compile and says cannot find symbol if I put them within the inputdialogs. 我不希望它们显示,但是程序无法编译,并且说如果我将它们放在输入对话框中也找不到符号。 It works for the optiondialog though. 它适用于optiondialog。

ABOVE IS FROM BEFORE PROBLEM WAS SOLVED 以上是解决问题之前的问题

Greatly appreciate those who are taking the time to read this. 非常感谢那些花时间阅读本文的人。

Here is the code (note investment1 and investment2 are just simple static methods with the proper formulas): 这是代码(请注意investment1和investment2只是具有适当公式的简单静态方法):

EDITED BELOW CODE; 编辑下面的代码; JUST TRYING TO ADD ERROR CHECKING FOR EMPTY STRINGS 只需尝试为空字符串添加错误检查

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);
}  

If the user clicks the "x" close button JOptionPane will return JOptionPane.CLOSED_OPTION 如果用户单击“ x”关闭按钮,则JOptionPane将返回JOptionPane.CLOSED_OPTION

You should start by checking for this... 您应该先检查一下...

if (choice != JOptionPane.CLOSED_OPTION) {
    // Do the normal stuff
} else {
    // Break out of the do loop
    break;
}

You should also beware, that using the JOptionPane.showOptionDialog the way you have, the JOptionPane will return the index of the option selected by the user. 您还应该注意,使用JOptionPane.showOptionDialogJOptionPane将返回用户选择的选项的索引。

That means that a return value of 0 means that the user selected "Compute years to reach target" and a return value of 1 means that the user selected "Compute target given number of years" 这意味着返回值0表示用户选择"Compute years to reach target" ,返回值1表示用户选择"Compute target given number of years"

Using JOptionPane.NO_OPTION or JOptionPane.YES_OPTION may not net the results you are expecting... 使用JOptionPane.NO_OPTIONJOptionPane.YES_OPTION可能无法获得预期的结果...

Updated with example 更新了示例

Your restructure allows for a slightly "sneaky" option, instead of using break, I simple set the again variable to JOptionPane.NO_OPTION when the user closes the option dialog... 您的重组允许一个稍微“偷偷摸摸”的选项,而不是使用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);
    }

Updated with additional example to handle cancelled input 更新了其他示例以处理取消的输入

So, if the user clicks the "x" button on the input dialogs, they will return null . 因此,如果用户在输入对话框中单击“ x”按钮,则他们将返回null At this point, you need to check for the null result and make choices about how you want to handle it. 此时,您需要检查是否为null结果,然后选择要如何处理它。 In the example below, I simply set the again to equal JOptionPane.NO_OPTION 在下面的示例中,我只是将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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM