JOptionPane处理OK、取消和X按钮

4

我在使用JOptionPane时遇到了一个问题,如果我不输入任何内容,无论我按什么键(确定、取消或JOptionPane右上角的x按钮),它都会一直提示我,直到我输入一个正数为止。但我只想在按下'确定'按钮时才提示。

如果我点击'取消'或JOptionPane右上角的x按钮,它将关闭JOptionPane

我该如何解决这个问题?

import javax.swing.JOptionPane;

public class OptionPane {
    public static void main(final String[] args) {
        int value = 0;
        boolean isPositive = false , isNumeric = true;
        do {
            try {
                value = Integer.parseInt(JOptionPane.showInputDialog(null,
                    "Enter value?", null));
            } catch (NumberFormatException e) {
                System.out.println("*** Please enter an integer ***");
                isNumeric = false;
            }

             if(isNumeric) {
                if(value <= 0) {
                    System.out.println("value cannot be 0 or negative");
                }

                else {
                    System.out.println("value is positive");
                    isPositive = true;
                }
            }
        }while(!isPositive);
    }
}

当取消或 X 按钮被按下时,您是否想要关闭弹出窗口? - Braj
@Braj 是的,我想在取消或按下x按钮后关闭弹出窗口。我的意思是,如果我不输入任何值,点击取消、确定或x按钮,JOptionPane将继续弹出。 - user3879568
那么您的意思是弹出窗口,直到输入任何正值为止,无论单击确定、取消和X按钮的位置如何? - Braj
请阅读JavaDocs,它清晰地说明了返回值。 - MadProgrammer
请尝试我的选项并告诉我您是否需要这个选项? - Braj
} while (!isPositive); 给用户一个 JSpinner 来选择一个值。使用 SpinnerNumberModel 来构造它。 - Andrew Thompson
3个回答

7
这方面的基本方法可以看起来像我下面展示的那样:

在@MadProgrammer评论之后更新。

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class DemoJOption {
    public static void main(String args[]) {
        int n = JOptionPane.showOptionDialog(new JFrame(), "Message", 
        "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, 
        null, new Object[] {"Yes", "No"}, JOptionPane.YES_OPTION);

        if (n == JOptionPane.YES_OPTION) {
            System.out.println("Yes");
        } else if (n == JOptionPane.NO_OPTION) {
            System.out.println("No");
        } else if (n == JOptionPane.CLOSED_OPTION) {
            System.out.println("Closed by hitting the cross");
        }
    }
}

2
JOptionPane.showOptionPane 不是返回一个整数,指示用户选择的选项,或者如果用户关闭对话框则返回 CLOSED_OPTION 吗?这意味着 n == 0 更准确,因为 JOptionPane.YES_OPTION 可以定义为任何值...。 - MadProgrammer
不要依赖于JOptionPane的常量,因为你不知道它们被设置为什么值,并且它们可能会在JVM的不同实现/版本之间发生变化,这就是问题所在。相反,你应该使用0或1来表示选项数组的已知索引值... - MadProgrammer
但无论他们是否更改JOptionPane常量的值,只要我在showOptionDialog(Component parentComponent,Object message,String title,int optionType,int messageType,Icon icon,Object [] options,Object initialValue)方法中使用JOptionPane常量作为Object initialValue参数,这都不重要。 - bluevoxel
在这种情况下,它确实如此,因为showOptionPane从OPTIONS数组返回选项的INDEX,而不是其中一个常量。这意味着,在此上下文中,如果用户选择“Yes”,返回值为“0”,如果他们选择“No”,则返回“1”。这只是一个偶然的事实,常量恰好相同,您不应该依赖于这个事实,而是依赖于您所知道的。在这个例子中,您唯一可以依赖的常量是CLOSE_OPTION,因为API明确表示它将返回它。 - MadProgrammer
我原本还想建议尝试将选项的顺序切换为 {"No", "Yes"} 作为一个示范 ;) - MadProgrammer
显示剩余3条评论

1

只需将代码移动到try块中,并且无需使用任何标志,只需在输入正数后打破无限循环即可。

示例代码:

public static void main(final String[] args) {
    int value = 0;
    while (true) {
        try {
            value = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter value?", null));

            if (value <= 0) {
                System.out.println("value cannot be 0 or negative");
            } else {
                System.out.println("value is positive");
                break;
            }
        } catch (NumberFormatException e) {
            System.out.println("*** Please enter an integer ***");
        }
    }
}

1
JoptionPane#showInputDialog returns user's input, or null meaning the user canceled the input.

因此,不要直接解析返回值。首先检查它是否为null(用户取消),如果不是null,则解析整数值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接