有 Java 编程相关的问题?

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

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 classNameboolean 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) 个答案

  1. # 1 楼答案

    我不完全相信你的全面方法。我认为“应该”/“可能”的情况是,用户输入您要求的所有信息,他们点击“接受”,您将验证用户输入的信息,如果正确,您将根据需要创建一个表示该输入结果的新对象

    我个人会避免使用一系列布尔值,或者至少以不同的方式暴露它们。我对它的主要问题是让它在我的脑海中保持清晰,位于0的元素实际上是什么意思

    相反,我会在ClassName类上提供getter/setter,允许我设置/获取特定属性。当然,可以在内部将这些值保存在数组中,但是任何使用该类的人都不需要知道如何存储这些值

    检查名Handler的问题在于,您正在用while-loop阻塞事件调度线程

    这将阻止程序响应用户输入(以及绘制本身)

            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
    

    Swing是一个单线程框架,这意味着对UI的所有交互和更改都将在EDT的上下文中执行。同样,任何阻止或阻止该线程处理事件队列的操作都会阻止它响应新事件,包括重新绘制请求,从而导致程序挂起

    相反,只需在if-else语句中检查名称即可。如果有效,则创建新的ClassName对象,如果无效,则显示一条消息并让该方法退出

    查看Concurrency in Swing了解更多详细信息