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应该在游戏引擎中。这是有道理的,但我不确定玩家的职业是什么?