有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

共 (2) 个答案

  1. # 1 楼答案

    JOptionPane.CANCEL_OPTION是一个静态int字段,不能将Stringint==进行比较


    良好实践

    如果您想一次性使用确定和取消按钮JOptionPane.showConfirmDialogJOptionPane.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
    
  2. # 2 楼答案

    根据JOptionPane API,如果用户取消对话框,则返回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 = "";
            }
        }
    }