Java JOptionPane取消按钮并获取输入

Java JOptionPane取消按钮并获取输入,java,joptionpane,Java,Joptionpane,我正试图让用户输入该名称,如果该名称留空,它将再次询问,如果他们填写该名称,它将设置一个JLabel,或者单击“取消”退出。 我的最后一个if语句是错误的,它不像nameEnt public Player() { //setBackground(Color.green); setSize(600, 400); name = new JLabel();//Input hint JOptionPane nameOption = new JOptionPane();

我正试图让用户输入该名称,如果该名称留空,它将再次询问,如果他们填写该名称,它将设置一个
JLabel
,或者单击“取消”退出。
我的最后一个if语句是错误的,它不像
nameEnt

public Player() {
    //setBackground(Color.green);
    setSize(600, 400);
    name = new JLabel();//Input hint
    JOptionPane nameOption = new JOptionPane();
    String nameEnt = nameOption.showInputDialog("First Name: ");
    if (!nameEnt.matches("[a-zA-Z]+")) {
        name.setText(nameEnt);
    }
    if (nameEnt.length() == 0) {
        //if this condition is true JOption stays until name is entered or canceled 
    }
    if (nameEnt == nameOption.CANCEL_OPTION) {
        System.exit(0);
    }
}

JOptionPane.CANCEL\u选项是一个静态的int字段,您不能将
String
int
=
进行比较


良好实践

在您的情况下,您希望一次性使用“确定”和“取消”按钮
JOptionPane.showConfirmDialog
JOptionPane.showInputDialog()
,但这是不可能的,我建议改为使用此按钮:

JTextField nameF = new JTextField(20);//create TextField

JPanel myPanel = new JPanel();//cerate JPanel
myPanel.add(new JLabel("Name"));
myPanel.add(nameF);//add your JTextField to your panel

int result;
do {
    result = JOptionPane.showConfirmDialog(null, myPanel,
            "Title of Panel", JOptionPane.OK_CANCEL_OPTION);//add your panel to JOptionPane
    if (result == JOptionPane.OK_OPTION) {//if the user press OK then
        if (nameF.getText().isEmpty()) {//check if the input is empty
            //if this condition is true JOption stays until name is entered or canceled 
        } else if (!nameF.getText().matches("[a-zA-Z]+")) {//check if the input match with your regex
            //name match exactly
            //name.setText(nameF.getText());
        }
    }
} while (result != JOptionPane.CANCEL_OPTION);//If the user hit cancel then exit
根据,如果用户取消对话框,则返回
null

因此正确的解决方案是不使用equals,而是先检查返回值是否为null,然后再检查其长度

public Player() {
    //setBackground(Color.green);
    setSize(600, 400);
    name = new JLabel();//Input hint
    JOptionPane nameOption = new JOptionPane();
    String nameEnt = nameOption.showInputDialog("First Name: ");
    if (nameEnt == null) {
        // user canceled. get out of here. 
        System.exit(0);

        // or return;  
        // or throw some exception
    }
    if (!nameEnt.matches("[a-zA-Z]+")) {
        name.setText(nameEnt);
    }
    if (nameEnt.length() == 0) {
        //if this condition is true JOption stays until name is entered or canceled 
    }
    // if (nameEnt == nameOption.CANCEL_OPTION) {
       //  System.exit(0);
    // }
}
但是为什么要用这种方式创建JOptionPane呢?最好使用静态的创建方法

// don't use null as the first parameter if the GUI is already showing
String nameEnt = JOptionPane.showInputDialog(null, "First Name: ");
if (nameEnt == null) {
    // user canceled. get out of here. 
    System.exit(0);
}
或者,如果您试图循环获取输入,则可能是这样的:

public Player() {
    setSize(600, 400);  // This is not good to do. Ask for details and I'll tell.

    name = new JLabel();// Don't forget to add this to the GUI!

    String nameEnt = "";
    while (nameEnt.trim().isEmpty()) {
        // if the GUI is already showing, pass a component from it as the first param here, not null
        nameEnt = JOptionPane.showInputDialog(null, "First Name: ");
        if (nameEnt == null) {
            // user canceled. get out of here. 
            System.exit(0);

            // or return;  
            // or throw some exception
        } else if (!nameEnt.matches("[a-zA-Z]+")) {
            name.setText(nameEnt);
        } else {
            // set it to "" so that we keep looping
            nameEnt = "";
        }
    }
}

1.OP不应该使用该字段的静态版本,
JOptionPane.CANCEL\u选项
,2。这不是一个整型字段而不是字符串吗?编辑,双击,是的,取消选项是一个静态整型字段。不要使用
.equals
来测试它,而应该使用
=
来测试它。是的,这是真的@hovercraftfullofels已经编辑它了,但是你仍然不能使用
=
来比较字符串和int。你应该使用
.equals
不兼容的操作数类型String和int“if(nameEnt==JOptionPane.CANCEL\u选项)”来准确地测试它。他首先不应该比较字符串和int。这毫无意义。如果用户不输入字母或将其留空,我该如何让窗口再次出现?@JamesParker:您可以使用
myString.trim().isEmpty()
测试空白。您可以使用while循环进行重复。但是如果这是一个图形用户界面,我会用完全不同的方式连接起来。这是一个图形用户界面,这样我就可以让玩家为刽子手输入他们的名字game@JamesParker:此项目有多个类?同样,我会用不同的方式接线。播放器类中不应包含GUI代码或用户交互代码,如JOptionPane或JLabel。这属于游戏类。玩家应该只包含玩家信息,并且应该是更多的JavaBean结构,包含基本构造函数、getter、setter、score字段等。所以我有四个类:Player、Words(字典)、Hangman(画图)和游戏引擎。那么您的意思是JOptionPane和JLabel应该在游戏引擎中。这是有道理的,但我不确定玩家的职业是什么?