2014-02-19 23 views
1

此项目的目标是创建两个班级:学生班级和GUI班级。学生类包含姓名,地址,余额和专业。我有学生和GUI类都创建我的问题是数组和循环。我需要让Student类数组和相关的计数器变量成为一个静态变量,并且每当用户输入Student类(名称,地址,平衡,主要)的信息时,它都会向JTextArea添加另一个Student对象。本质上,每次按下JButton时,JTextArea都会更新新学生的信息而不删除旧信息。任何帮助,使这项工作将不胜感激!设计并实施能够不断接受输入并创建多个学生对象的“学生”班

我的代码:

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 

class Student { 

    private String name; 
    private String address; 
    private String balance; 
    private String major; 

    // Constructs fields 
    public Student(String name, String address, String balance, String major) { 
     this.name = name; 
     this.address = address; 
     this.balance = balance; 
     this.major = major; 
    } 

    public String setName(String Name) { 
     this.name = name; 
     return name; 
    } 

    public String setAddress(String address) { 
     this.address = address; 
     return address; 
    } 

    public String setBalance(String balance) { 
     this.balance = balance; 
     return balance; 
    } 

    public String setMajor(String major) { 
     this.major = major; 
     return major; 

    } 

    public String toString() { 
     return ("Name: " + this.name + " Address: " + this.address 
       + " Balance: " + this.balance + " Major: " + this.major); 
    } 
} 

public class SecondAssignment extends JFrame implements ActionListener { 
    public SecondAssignment() { 
     setLayout(new GridLayout(6, 1, 1, 1)); 

     // Creates TextField, TextArea, and button components 
     name = new JTextField(); 
     address = new JTextField(); 
     balance = new JTextField(); 
     major = new JTextField(); 
     JButton jbtSubmit = new JButton("Submit"); 
     echoStudent = new JTextArea(); 

     // Add TextField, TextArea, and button components to the frame 
     add(new JLabel("Name: ")); 
     add(name); 
     add(new JLabel("Address: ")); 
     add(address); 
     add(new JLabel("Balance: ")); 
     add(balance); 
     add(new JLabel("Major: ")); 
     add(major); 
     add(new JLabel("Submit Button: ")); 
     add(jbtSubmit); 
     jbtSubmit.addActionListener(this); 
     add(echoStudent); 
     echoStudent.setEditable(false); 

    } 

    // TextFields 
    private JTextField name; 
    private JTextField address; 
    private JTextField balance; 
    private JTextField major; 

    // Echo TextArea 
    private JTextArea echoStudent; 

    // Listener 
    public void actionPerformed(ActionEvent a) { 
     Student student1 = new Student(name.getText(), address.getText(), 
       balance.getText(), major.getText()); 
     echoStudent.setText(student1.toString()); 
    } 

    public static void main(String[] args) { 
     SecondAssignment frame = new SecondAssignment(); 
     frame.setTitle("Student Interface"); 
     frame.setSize(500, 700); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setVisible(true); 

    } 

} 
+0

你的意思是你想每次点击提交按钮时清除表单输入文本?或者你想存储所有的学生并将其全部显示出来? – bagage

+0

对不起,我不是很清楚。我的数组可以是一个50的静态大小,可以存储50个“学生”,而不必在按下按钮后清除JTextArea。 – Ben

+0

为什么你需要一个大小为50的静态数组而不是像一个简单的List容器那样的动态数组? – bagage

回答

3

要保存你的学生,你可以做到这一点无论是静态的(使用固定尺寸的阵列)或动态(使用集合,如List)。

在这两种方式中,您的SecondAssignment类都需要存储此元素并填写创建的学生。

静态的方式

如果你需要的大小50的静态数组,只需将它声明:

private Student[] myStudents = new Student[50]; 
private int currentIndice = 0; 

然后在行动中进行,可以节省您的学生:

public void actionPerformed(ActionEvent a) { 
    Student student1 = new Student(name.getText(), address.getText(), 
      balance.getText(), major.getText()); 

    //check that we have still room in the array 
    if (currentIndice < 50) { 
     myStudents[currentIndice] = student1; 
     // increase indice to the next available element 
     ++currentIndice; 
    } 
    //otherwise handle error 
    else { 
     //some error management 
    } 
    echoStudent.setText(student1.toString()); 
} 

此解决方案的主要缺点是您的数组具有固定大小,因此您无法处理超过50名学生。

动态方式

相反,你可以添加元素的集合,将时间增加时间。 首先导入包:

import java.util.ArrayList; 
import java.util.List; 

然后声明列表:

private List<Student> myStudents = new ArrayList<>; 

而在你actionPerformed方法:

public void actionPerformed(ActionEvent a) { 
    Student student1 = new Student(name.getText(), address.getText(), 
      balance.getText(), major.getText()); 
    //simply add the new student to the list 
    myStudents.add(student1); 

    echoStudent.setText(student1.toString()); 
} 

您可以myStudents.size()找回学生的数量,并从中获益收藏功能(从列表中删除,在列表中搜索等)。

编辑

尼克Rippe说,如果echoStudent标签必须处理所有学生的名单中,更简单的方法是保留而不是每次都重新设置当前文本:与echoStudent.setText(echoStudent.getText() + "\n" + student1.toString());更换echoStudent.setText(student1.toString());会做例如作业(\n是新行的转义序列)。

+0

问题的第一部分的好答案。 OP还询问如何保持文本区域('echoStudent')与所有学生记录(不只是最后一个)保持一致。我想提到那个简单的修复。 –

+1

这是一个梦幻般的答案。谢谢!!我利用动态的方式和静态的方式让这个程序完成预定的任务,而且我绝对觉得我现在可以更好地理解这些概念。接受答案! – Ben

+1

@NickRippe我确实编辑了我的答案。 @Ben很高兴你用'swing'学到了一些东西,祝你好运:D – bagage