前言:
博主在深入了解Java的语法后,觉得前段时间数据库课设写的代码有点菜了,于是决定重写界面设计部分(数据库的dao层没改)
总结一下这次写的和之前的对比有哪些改进呢?(其实主要是代码行数,原来同样的UI界面设计需要代码500行+,现在才200行+,优化了接近300行了)
一、不同类实现不同功能
原来写的代码太冗余而且长,主要是几个界面的代码全放在一个类中,所以可读性不咋地,java嘛,本来就是面向对象的语言,不多写几个类就会搞得像面向过程一样了,多写几个类有什么好处呢?首先,不同类的类名就可以看出类的功能特性,以这次代码为例:one.class就放第一个界面的代码,two_four.class就放第二个到第四个界面的代码,Test类不难看出这个类就是测试的,用于生成界面类的实例对象。把整个UI层用多个类分开,这样找bug时也更方便,写代码思路也清晰。
二、使用新语法:
之前写的太多重复、单一化的语句了,比如:
JPanel jep1=null;JTextField JeTF1=null;JLabel jeb1 = null;
JPanel jep2=null;JButton JeB1=null;
JPanel jep3=null;JButton JeB2=null;
JPanel jep4=null;JTextField JeTF4=null;JLabel jeb4 = null;
JPanel jep5=null;JTextField JeTF5=null;JLabel jeb5 = null;
JPanel jep6=null;JTextField JeTF6=null;JLabel jeb6 = null;
JPanel jep7=null;JTextField JeTF7=null;JLabel jeb7 = null;
JPanel jep8=null;JTextField JeTF8=null;JLabel jeb8 = null;
JPanel jep9=null;JTextField JeTF9=null;JLabel jeb9 = null;
JPanel jep10=null;JTextField JeTF10=null;JLabel jeb10 = null;
JPanel jep11=null;JTextField JeTF11=null;JLabel jeb11 = null;
JPanel jep12=null;JTextField JeTF12=null;JLabel jeb12 = null;
看到这么多眼睛都难受,这次直接用到泛型数组,还用到了循环语句避免了大量的相似代码重写,还有for(each:element){}这种简化循环的语法格式,lambda表达式,
三、小技巧
比如在two_four.class的addjp方法中通过一个形参变量j用于区分第二、三个界面和第四个界面,j=0时用于第二、三个界面,j=1时用于第四个界面,如果没有这个技巧我就得将two_four.class分开写成two.class,three.class,four.class,这样代码量又大了,而且又会造成代码冗余。
四、工厂思想的体现
一个类中不同的方法用于不同的功能。比如setjl方法用于设置label标签,addjp方法用于将子面板放入主面板中,这就像个工厂一样。在Test.class中通过传递参数到界面类中的特定方法从而实现特定功能。当然用spring框架更快,连界面设置的类都不用写了。
UI图:
好,接下来搬代码,由于各个界面实现功能差不多,所以在one.java中详细作了注释,其他几个界面类原来差不多:
one.java
package ZTY;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
public class one {
public final JPanel japmax = new JPanel();//最后将所有界面一所有子面板放在japmax中
private final ArrayList<JPanel> jap = new ArrayList<>(10);//存所有子面板
private final JButton jab = new JButton();//界面一的按钮
private final ArrayList<JLabel> jal = new ArrayList<>(10);//界面一的标签
private final ArrayList<JTextField> JTFA = new ArrayList<>(10);//界面一的输入文本框
public void makejap(int size) {//为泛型数组jap赋予真实面板元素,size指定数组元素个数
for (int i = 0; i < size; i++) {
jap.add(new JPanel());
}
}
public void makeJTFA(int size) {//为泛型数组JTFA赋真实面板元素,size指定数组元素个数
for (int i = 0; i < size; i++) {
JTFA.add(new JTextField(8));//8为输入框的宽度
}
}
public void makejab(String name, Dimension preferredSize) {//为按钮设置名字和大小
jab.setText(name);
jab.setPreferredSize(preferredSize);
}
public void setJal(int index, String name) {//为泛型数组jal赋真实标签元素
jal.add(index, new JLabel(name));
}
public void addjap() {
for (int i = 0; i < 7; i++) {
jap.get(i).add(jal.get(i));//前七个标签放到jap中
jap.get(i).add(JTFA.get(i));//前七个输入框放到jap中
}
jap.get(7).add(jab);//按钮放到jap中
jap.get(8).add(jal.get(7));//作者:ZTY的标签放到jap中
for (JPanel jxap : jap) {//将所有的子标签加入到表示界面一的大面板japmax中
japmax.add(jxap);
}
}
}
two_to_four.java
package ZTY;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
public class two_to_four {
public final JPanel jpmax = new JPanel();//设置public可以在Test.java中访问常量jpmax,如果为private则不能访问
private final ArrayList<JPanel> jp = new ArrayList<>(10);
private final JButton jb = new JButton();
private final ArrayList<JLabel> jl = new ArrayList<>(10);
private final ArrayList<JTextField> JTF = new ArrayList<>(10);
public void makejp(int size) {
for (int i = 0; i < size; i++) {
jp.add(new JPanel());
}
}
public void makeJTF(int size) {
for (int i = 0; i < size; i++) {
JTF.add(new JTextField(8));
}
}
public void makejb(String name, Dimension preferredSize) {
jb.setText(name);
jb.setPreferredSize(preferredSize);
}
public void setJl(int index, String name) {//为泛型数组jl赋真实标签元素
jl.add(index, new JLabel(name));
}
public void addjp(int j) {//注意:当j为0时用于第二三个界面,j为1时用于第四个界面
for (int i = 0; i < 5+j; i++) {//放标签和输入文本框
jp.get(i).add(jl.get(i));
jp.get(i).add(JTF.get(i));
}
jp.get(5+j).add(jb);//放按钮
for (JPanel jxp : jp) {
jpmax.add(jxp);
}
}
}
five.java
package ZTY;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
public class five {
public final JPanel jepmax = new JPanel();
private final JButton jeb1 = new JButton();
private final JButton jeb2 = new JButton();
private final ArrayList<JPanel> jep = new ArrayList<>(10);
private final ArrayList<JLabel> jel = new ArrayList<>(10);
private final ArrayList<JTextField> JTFE = new ArrayList<>(10);
public void makejep(int size) {
for (int i = 0; i < size; i++) {
jep.add(new JPanel());
}
}
public void makeJTFE(int size) {
for (int i = 0; i < size; i++) {
JTFE.add(new JTextField(8));
}
}
public void makejeb(String name1,String name2, Dimension preferredSize) {
jeb1.setText(name1);
jeb1.setPreferredSize(preferredSize);
jeb2.setText(name2);
jeb2.setPreferredSize(preferredSize);
}
public void setJel(int index, String name) {
jel.add(index, new JLabel(name));
}
public void addjep(){
jep.get(0).add(jel.get(0));
jep.get(0).add(JTFE.get(0));
jep.get(1).add(jeb1);
jep.get(2).add(jeb2);
for(int i=0;i<jel.size()-1;i++){
jep.get(i+3).add(jel.get(i+1));
jep.get(i+3).add(JTFE.get(i+1));
}
for (JPanel jexp : jep) {
jepmax.add(jexp);
}
}
}
Test.java
package ZTY;
import javax.swing.*;
import java.awt.*;
public class Test extends JFrame {//继承JFrame类
public Test(){
//生成各个类的实例
one one=new one();
two_to_four two=new two_to_four();
two_to_four three=new two_to_four();
two_to_four four=new two_to_four();
five five=new five();
one.makejap(9);//学生个人信息输入界面设置
one.makeJTFA(7);
one.setJal(0,"学号");
one.setJal(1,"姓名");
one.setJal(2,"性别");
one.setJal(3,"生日");
one.setJal(4,"籍贯");
one.setJal(5,"院系");
one.setJal(6,"班级");
one.makejab("输入",new Dimension(150,20));
one.setJal(7,"作者:ZTY");
one.addjap();
two.makejp(6);//学籍变更情况输入界面设置
two.makeJTF(5);
two.setJl(0,"记录号");
two.setJl(1,"学号");
two.setJl(2,"变更代码");
two.setJl(3,"记录时间");
two.setJl(4,"描述");
two.makejb("输入",new Dimension(136,20));
two.addjp(0);//注意j的作用
three.makejp(6);//奖励情况输入界面设置
three.makeJTF(5);
three.setJl(0,"记录号");
three.setJl(1,"学号");
three.setJl(2,"级别代码");
three.setJl(3,"记录时间");
three.setJl(4,"描述");
three.makejb("输入",new Dimension(136,20));
three.addjp(0);//注意j的作用
four.makejp(7);//处罚情况输入界面设置
four.makeJTF(6);
four.setJl(0,"记录号");
four.setJl(1,"学号");
four.setJl(2,"级别代码");
four.setJl(3,"记录时间");
four.setJl(4,"描述");
four.setJl(5,"是否生效");
four.makejb("输入",new Dimension(136,20));//设置按钮名字和大小
four.addjp(1);
five.makejep(13);//学生个人情况查询和修改界面设置
five.makejeb("查询","修改",new Dimension(136,20));//设置按钮名字和大小
five.makeJTFE(11);
five.setJel(0,"学号");
five.setJel(1,"学籍变动");
five.setJel(2,"记录时间");
five.setJel(3,"描述");
five.setJel(4,"奖励");
five.setJel(5,"记录时间");
five.setJel(6,"描述");
five.setJel(7,"处罚");
five.setJel(8,"记录时间");
five.setJel(9,"描述");
five.setJel(10,"是否生效");
five.addjep();
JTabbedPane JTP=new JTabbedPane();//最外层的选项卡面板
JTP.addTab("学生个人信息输入界面 ",one.japmax);
JTP.addTab("学籍变更情况输入界面",two.jpmax);
JTP.addTab("奖励信息输入界面",three.jpmax);
JTP.addTab("处罚情况输入界面",four.jpmax);
JTP.addTab("学生个人情况查询和修改界面",five.jepmax);
JTP.addChangeListener(e -> System.out.println("当前选中的选项卡: " + JTP.getSelectedIndex()));
JTP.setSelectedIndex(0);
this.add(JTP);
this.setLayout(new GridLayout(2, 1));
this.setContentPane(JTP);
this.setSize(600,400);
this.setLocation(400, 180);
this.setTitle("学生信息管理系统");
this.setVisible(true);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String []args){
Test test=new Test();
}
}