JAVA实验课老师要我们练习使用对象数组。本人自然是要以GUI界面表示。尝试后发现JAVA中动态添加控件的方法貌似和.NET一样,先用new关键字声明一个控件对象,之后声明对该对象的引用。
于是,本程序自然成为了弱智程序,输入人数后自动生成相应的文本框让用户输入,完全没有技术含量(最终还是试验成功了Listener类)。无论如何,这又算学习JAVA过程中的一个纪念程序吧。(至少比上次那个矩阵相乘的界面要高级一些)JAVA牛人请无视这个程序吧……
有以下几点需要说明:
(1)主窗体JFrame中的GridLayout的行数设置为0,目的是要系统根据控件数目自动设置行数。(本来我手动设置为Count+2,不过系统把列数自动修改为4,界面全乱了。原因尚不明确,郁闷中……)
(2)由于在main方法中有一个嵌套类用以接收按钮单击的事件,而这个类又要对main方法中的一些变量进行调用,所以这些变量(就是一些对象的引用变量)以final关键字修饰。
(3)本程序未加入错误处理,输入错误时程序会出错。
程序运行界面如下图:
代码如下:
/*
作者: 计算机科学与技术084 谢XX
编写日期:2010-5-11
备注:
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LieoGradeCalculator extends JFrame {
private static final long serialVersionUID = 1L;
private static int Count = 0;
public LieoGradeCalculator(String title, int Width, int Height) {
this.setTitle(title);
this.setSize(Width, Height);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setLayout(new GridLayout(0, 5, 1, 1));
this.setVisible(true);
}
public static void main(String[] args) {
int i;
while (Count > 10 || Count < 1)
Count = Integer.parseInt(JOptionPane.showInputDialog("请输入学生人数:"));
final JTextField txtMath[] = new JTextField[Count];
final JTextField txtJava[] = new JTextField[Count];
final JTextField txtEnglish[] = new JTextField[Count];
final JTextField txtAverage[] = new JTextField[Count];
LieoGradeCalculator MainFrame = new LieoGradeCalculator("Lieo成绩计算器", 400, 40 * (Count + 2));
MainFrame.add(new JLabel("学号"));
MainFrame.add(new JLabel("数学成绩"));
MainFrame.add(new JLabel("Java成绩"));
MainFrame.add(new JLabel("英语成绩"));
MainFrame.add(new JLabel("平均成绩"));
for (i = 0; i < Count; i++) {
MainFrame.add(new JLabel("ID:" + (i + 1)));
txtMath[i] = new JTextField();
txtJava[i] = new JTextField();
txtEnglish[i] = new JTextField();
txtAverage[i] = new JTextField();
txtAverage[i].setEditable(false);
MainFrame.add(txtMath[i]);
MainFrame.add(txtJava[i]);
MainFrame.add(txtEnglish[i]);
MainFrame.add(txtAverage[i]);
}
MainFrame.add(new JLabel("各科平均"));
final JTextField txtMathAverage = new JTextField();
final JTextField txtJavaAverage = new JTextField();
final JTextField txtEnglishAverage = new JTextField();
txtMathAverage.setEditable(false);
txtJavaAverage.setEditable(false);
txtEnglishAverage.setEditable(false);
MainFrame.add(txtMathAverage);
MainFrame.add(txtJavaAverage);
MainFrame.add(txtEnglishAverage);
JButton btCalc = new JButton("计算");
MainFrame.add(btCalc);
btCalc.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int s1, s2, s3;
int i;
StudentInfo stuInfo[] = new StudentInfo[Count];
for (i = 0; i < Count; i++) {
stuInfo[i] = new StudentInfo();
stuInfo[i].setMath(Integer.parseInt(txtMath[i].getText()));
stuInfo[i].setJava(Integer.parseInt(txtJava[i].getText()));
stuInfo[i].setEnglish(Integer.parseInt(txtEnglish[i].getText()));
txtAverage[i].setText(String.valueOf(stuInfo[i].getAverage()));
}
s1 = 0;
s2 = 0;
s3 = 0;
for (i = 0; i < Count; i++) {
s1 += stuInfo[i].getMath();
s2 += stuInfo[i].getJava();
s3 += stuInfo[i].getEnglish();
}
txtMathAverage.setText(String.valueOf((int) (s1 * 100 / Count) / 100.00));
txtJavaAverage.setText(String.valueOf((int) (s2 * 100 / Count) / 100.00));
txtEnglishAverage.setText(String.valueOf((int) (s3 * 100 / Count) / 100.00));
}
});
}
}
class StudentInfo {
private int Math, Java, English;
public int getMath() {
return this.Math;
}
public int getJava() {
return this.Java;
}
public int getEnglish() {
return this.English;
}
public void setMath(int score) {
this.Math = score;
}
public void setJava(int score) {
this.Java = score;
}
public void setEnglish(int score) {
this.English = score;
}
public double getAverage() {
return ((int) ((this.Math + this.Java + this.English) * 100 / 3.0)) / 100.0;
}
}