checkName()和将用户输入存储到ArrayList和boolean[]的java问题
这里我有一个GUI窗口,它基本上要求用户选择一个JRadioButton并在JTextField中键入内容,然后选择confirm/cancel
这是一个我们必须制作UML到Java文本文件的项目。用户将输入类信息并选择UML关系,该程序必须在JTextField上打印Java clsas文本。就像在eclipse中创建新类一样
我想做的是创建一个布尔[]来存储布尔数组,当用户选择JRadioButton_a时,它将存储true,当用户选择JRadioButton_B时,它将存储false。我还希望JTextField中键入的内容由checkName()检查,如果方法返回false,字符串将存储在ArrayList中
下面是我的代码——getName()方法和布尔[]在存储true和false时存在一些问题。当用户需要再次输入名称时,它会将丢弃的sting/boolean保存到数组中。(对不起,我的英语不好!)有没有更好的方法来制作这个节目?我觉得我把事情复杂化了,应该有一个更简单的方法
以下是要求用户输入类信息的UI内容。用户必须选择public/private,然后输入类名和JTextField
private class Handler implements ActionListener{
public void actionPerformed(ActionEvent event){
String name = inputClassName.getText();
classObject.addName(name);
while (classObject.checkName(name) == true){
JOptionPane.showMessageDialog(null, "Class name invalid. " +
"\nEntered name should not contain java keywords or equal to other existing names. " +
"\nPlease try again."); // doesn't work
name = inputClassName.getText();
classObject.addName(name);
}// end if
JOptionPane.showMessageDialog(null, "Class saved."); // doesn't work
name = inputClassName.getText();
classObject.addName(name);
}// end actionPerformed()
}// end Handler class
private class Handler2 implements ActionListener{
public void actionPerformed(ActionEvent event){
boolean b = true;
b = classObject.setPP();
}
}
private class Handler3 implements ActionListener{
public void actionPerformed(ActionEvent event){
boolean b = false;
b = classObject.setPP();
}
}
以下是存储ArrayList和boolean[]的输入的方法
Scanner input = new Scanner(System.in);
JavaKeywords keyObject = new JavaKeywords();
private ArrayList<String> className = new ArrayList<String>();
private String name = new String();
private int size = className.size();
private Boolean[] bArray = new Boolean[size];
public boolean checkName(String name){
boolean check = true;
for (int i=0; i<=size; i++){
if (keyObject.containsKeyword(className.get(i)) || name.equals(className.get(i))){
boolean o = false;
check = o;
}// end if
}// end for
return check;
}// end checkName
public boolean setPP(){
boolean b = true;
return b;
}
public void addPP(Boolean[] bArray){
this.bArray = bArray;
for (int i=0; i>=size; i++){
bArray[i] = setPP();
}
}// add a Array of boolean. for className[i], its class type = item[i] in bArray.
// public = true, private = false
public String getPublicPrivate(){
String p = "";
for (int i =0; i<=size; i++){
if(bArray[i]=true)
p = "public";
else
p = "private";
}
return p;
}
已解决
解决方案:将string className
和boolean isPrivate
存储在一个类中,并将该类变成一个ArrayList
可以避免所有的麻烦。但后来我遇到了另一个问题,那就是在我更改代码后checkName()
不起作用。
这里是ActionListener
private class Handler implements ActionListener{
public void actionPerformed(ActionEvent event){
VirtualClass virtualObject = new VirtualClass();
classObject.addClass(virtualObject);
String name = inputClassName.getText();
virtualObject.className = name;
if (classObject.checkName(name) == false){
JOptionPane.showMessageDialog(null, "Class name invalid. " +
"\nEntered name should not contain java keywords or equal to other existing names. " +
"\nPlease try again."); // Always return "invalid" message
} else {
JOptionPane.showMessageDialog(null, "Class saved.");
name = inputClassName.getText();
virtualObject.className = name;
}
if (event.getSource() == publicButton) {
virtualObject.isPrivate = false;
} else if (event.getSource() == privateButton) {
virtualObject.isPrivate = true;
}
}// end actionPerformed()
这里是checkName()
方法
public boolean checkName(String name){
boolean check = true;
for (int i=0; i<=size; i++){
if (keyObject.containsKeyword(classes.get(i).className) || name.equals(classes.get(i).className)){
boolean o = false;
check = o;
}// end if
}// end for
return check;
}// end checkName
对于checkName()
中的containsKeyword()
,我使用了@MrLore从How to check if the class name is valid?中的JavaKeywords
类
# 1 楼答案
我不完全相信你的全面方法。我认为“应该”/“可能”的情况是,用户输入您要求的所有信息,他们点击“接受”,您将验证用户输入的信息,如果正确,您将根据需要创建一个表示该输入结果的新对象
我个人会避免使用一系列布尔值,或者至少以不同的方式暴露它们。我对它的主要问题是让它在我的脑海中保持清晰,位于
0
的元素实际上是什么意思相反,我会在
ClassName
类上提供getter/setter,允许我设置/获取特定属性。当然,可以在内部将这些值保存在数组中,但是任何使用该类的人都不需要知道如何存储这些值检查名
Handler
的问题在于,您正在用while-loop
阻塞事件调度线程这将阻止程序响应用户输入(以及绘制本身)
Swing是一个单线程框架,这意味着对UI的所有交互和更改都将在EDT的上下文中执行。同样,任何阻止或阻止该线程处理事件队列的操作都会阻止它响应新事件,包括重新绘制请求,从而导致程序挂起
相反,只需在
if-else
语句中检查名称即可。如果有效,则创建新的ClassName
对象,如果无效,则显示一条消息并让该方法退出查看Concurrency in Swing了解更多详细信息