2013-10-23 18 views
0

因此,在这里我有一个GUI窗口,它基本上要求用户选择一个JRadioButton并在JTextField中键入内容,然后选择确认/取消。错误当单击一个JButton - ActionEvent没有执行(解决)

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

我想要做的是做一个布尔型[]来存储布尔值的数组,当用户选择JRadioButton_A它将存储true,当用户选择JRadioButton_B它会存储false.And我也想要输入的东西JTextField由checkName()检查,如果方法返回false,则字符串将存储在ArrayList中。

下面是我的代码 - 错误是当用户单击confirmButton时,程序停止并且没有任何反应。此外,在getName()方法中存在一些问题,而存储true和false的布尔型[]。当用户需要再次输入名称时,它会将废弃的sting/boolean保存到数组中。 (抱歉我的英文不好!)有没有更好的方法来制作这个程序?我觉得我正在复杂的事情,应该有一个更简单的方法来做到这一点。

这里是我的UI类

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.Scanner; 

public class AddClass extends JFrame{ 
Scanner input = new Scanner(System.in); 
ClassName classObject = new ClassName(); 

private JRadioButton publicButton, privateButton; 
private JLabel className; 
private JTextField inputClassName; 
private JButton confirmButton; 
private JButton cancelButton; 

public AddClass(){ 
    super("Add class"); 
    setLayout(new FlowLayout()); 

    publicButton = new JRadioButton("public", true); 
    privateButton = new JRadioButton("private", false); 
    className = new JLabel("Class Name: "); 
    inputClassName = new JTextField(10); 
    confirmButton = new JButton("Confirm"); 
    cancelButton = new JButton("Cancel"); 

    add(publicButton);  
    add(privateButton);  
    add(className);  
    add(inputClassName);   
    add(confirmButton); 
    add(cancelButton); 

    ButtonGroup group = new ButtonGroup(); 
    group.add(publicButton); 
    group.add(privateButton); 

    Handler handler = new Handler(); 
//  Handler2 handler2 = new Handler2();  
//  Handler3 handler3 = new Handler3(); 
    confirmButton.addActionListener(handler); 
//  publicButton.addActionListener(handler2); 
//  privateButton.addActionListener(handler3); 
    }// end constructor AddClass() 

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 = input.nextLine(); 
      classObject.addName(name); 
     }// end if 
     JOptionPane.showMessageDialog(null, "Class saved."); // doesn't work 
     name = input.nextLine(); 
     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(); 
     } 
    } 


}// end AddClass 

这是我用来存储用户输入

import java.util.Scanner; 
import java.util.ArrayList; 

public class ClassName { 
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 void addName(String name){ 
    this.name = name; 
    className.add(name); 
}// end addName() 

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

public void setName(String name){ 
    this.name = name; 
}//end setName() 

public String getName(){ 
    return name; 
}// end getName() 

public ArrayList<String> getAllNames(){ 
    return className; 
}// end getAllNames() 

public void setAllNames(ArrayList<String> className){ 
    this.className = className; 
}// end setAllNames() 

}//end class 

回答

0

当用户单击确认按钮时程序“停止”的原因是程序正在等待命令行上的输入。具体而言,您的input变量与System.in(即命令行)关联。

您只需在命令行键入您的答案,按Enter键,您的程序将继续。

OTOH,我怀疑使用命令行不是你想要的,因为你使用的是GUI。相反,您可以添加一个输入字段(例如JTextBox)。

+0

谢谢!我刚刚纠正了这个问题,并持续了一段时间,直到** showMessageDialog **弹出。在我关闭消息框后,程序再次“停止”:( – Sue

+0

下一行('name = input.nextLine();')仍然等待命令行的输入 – Attila

+0

哦,谢谢....我是如此愚蠢的LOL – Sue

0

ActionListener的确认按钮Scanner实例input在这个语句块等待用户输入类

String name = input.nextLine(); 

只有在输入值后,ActionEvent才会完成。

解决方案:添加一个JTextField作为从用户读取输入的替代方法。

+0

我只是将其更改为** String name = inputClassName.getText(); ** 并执行actionEvent。但是,我无法使用右上角的“x”关闭窗口。该计划刚刚停止。另外checkName()方法不起作用.... :(请帮忙?) – Sue

+0

1)您需要为'JFrame'调用'setDefaultCloseOperation' 2)'checkName()'不在这个问题的范围之内 - 请发布一个新问题 – Reimeus