0

这里我有一个 GUI 窗口,它基本上要求用户选择一个 JRadioButton 并在 JTextField 中键入一些内容,然后选择确认/取消。

这是一个我们必须制作 UML-to-Java 文本文件的项目。用户将输入类信息并选择 UML 关系,该程序必须在 JTextField 上打印出 Java clsas 文本。就像在 Eclipse 中创建一个新类一样。

我想要做的是创建一个 boolean[] 来存储布尔数组,当用户选择 JRadioButton_A 时它将存储 true,当用户选择 JRadioButton_B 时它将存储 false。我还希望检查在 JTextField 中键入的内容通过 checkName(),如果方法返回 false,则字符串将存储在 ArrayList 中。

下面是我的代码 - getName() 方法和用于存储 true 和 false 的 boolean[] 存在一些问题。当用户需要再次输入名称时,它会将丢弃的 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 classNameand存储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

因为我使用了containsKeyword()如何检查类名是否有效?通过@MrLore。checkName()JavaKeywords

4

2 回答 2

1

可能我要做的是创建一个简单的类来表示您的字段,这样您就不必使用多个列表了。

public class VirtualClass {
    public boolean isPrivate;
    public String className = "Object";
}

ArrayList<VirtualClass> classes = new ArrayList<VirtualClass>(0);

public void addClass(VirtualClass clazz) {
    classes.add(clazz);
}

否则,您将不得不创建第二个某种类型的列表来保存公共/私有。您只需要并行更改它们。

// in actionPerformed

ClassObject.VirtualClass clazz = new ClassObject.VirtualClass();

clazz.isPrivate = rbPrivate.isSelected();
clazz.className = tfClassName.getText();

classObject.addClass(clazz);

并且只需忽略单选按钮上的收听,因为从技术上讲,在您将类添加到列表之前,您不需要它们的状态。

要稍后访问这些字段,您只需要

for (VirtualClass clazz : classes) {
    System.out.println((clazz.isPrivate ? "private" : "public") + " " + clazz.className);
}

// or something like

for (int i = 0; i < classes.size(); i++) {
    System.out.println(classes.get(i).className + ":");
    if (classes.get(i).isPrivate) {
        System.out.println(" private");
    } else {
        System.out.println(" public");
    }
}
于 2013-10-23T20:13:38.667 回答
0

我并不完全相信你的整体方法。我认为“应该”/“可能”发生的是,用户输入您询问的所有信息,他们点击“接受”,您验证用户输入的信息,如果正确,您创建一个代表的新对象根据需要输入此输入的结果。

我个人会避免使用布尔数组,或者至少以不同的方式公开它们。我遇到的主要问题是保持头脑清醒,该元素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对象,如果无效,则显示一条消息并让方法退出。

查看Swing 中的并发以获取更多详细信息

于 2013-10-23T20:13:20.310 回答