学生选课系统—Swing+MySQL(二)
JTable表格绝对是这次选课系统界面部分的重要组成部分,毕竟作为一个选课系统大部分信息的查看都通过JTable表格来显示,通过这几天对于表格的使用,做了一个小总结。
首先便是数据库数据的传入
最简单的便是直接用二维数组直接传入,指定表格列名数组和表格数据数组创建表格。
Object[] columnNames = new String[] { "课程编号", "名称", "时间", "教师", "教室" };
List<Course> courses = new CourseDAO().referList(teacherName);
Object[][] data = new String[courses.size()][5];
int count = 0;
for (Course course : courses) {
data[count][0] = String.valueOf(course.courseId);
data[count][1] = String.valueOf(course.courseName);
data[count][2] = String.valueOf(course.courseTime);
data[count][3] = String.valueOf(course.courseTeacher);
data[count][4] = String.valueOf(course.courseRoom);
count++;
}
JTable table = new JTable(data,columnNames);
但是,这样很难实现数据的实时更新,而且每次更新数组都要重新进行一次for循环,很明显,这个方法不可取。然后,我找到了另一种方法,AbstractTableModel—一个神奇的抽象类,自己写一个TableModel,继承这个类,再实现getRowCount(),getColumnCount(),getValueAt()这三个方法,数据实时更新完美实现,美滋滋。
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class TableModel extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
String[] columnNames = new String[] { "课程编号", "名称", "时间", "教师", "教室"};
// 使用从DAO返回的List作为TableModel的数据
public List<Course> courses = new CourseDAO().list();
// courses.size返回一共有多少行
public int getRowCount() {
// TODO Auto-generated method stub
return users.size();
}
// courses.size返回一共有多少列
public int getColumnCount() {
// TODO Auto-generated method stub
return columnNames.length;
}
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
// 然后根据columnIndex返回对应的属性
public Object getValueAt(int rowIndex, int columnIndex) {
Course course = courses.get(rowIndex);
if (0 == columnIndex)
return course.courseId;
if (1 == columnIndex)
return course.courseName;
if (2 == columnIndex)
return course.courseTime;
if (3 == columnIndex)
return course.courseTeacher;
if (4 == columnIndex)
return course.courseRoom;
return null;
}
}
TableModel model = new TableModel();
JTable table = new JTable(model);
看,实时更新就是如此简单,这种快乐一直持续到我做查询部分,我发现我没有办法往TableModel里传参数。唉,看来我和你有缘无分啊,没办法,我又开始了新的尝试,
最后,我两者都取了一部分,所以,我的最终版是这样的:
public static Object[][] data(int semester){
List<Course> courses = new CourseDAO().list(semester);
Object[][] data = new String[courses.size()][5];
int count = 0;
for (Course course : courses) {
data[count][0] = String.valueOf(course.courseId);
data[count][1] = String.valueOf(course.courseName);
data[count][2] = String.valueOf(course.courseTime);
data[count][3] = String.valueOf(course.courseTeacher);
data[count][4] = String.valueOf(course.courseRoom);
count++;
}
return data;
}
public CourseMain() throws Exception {
JFrame frame = new JFrame("管理界面");
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
// 获取屏幕的宽、高
double width = screen.getWidth();
double height = screen.getHeight();
int x = (int) (width - 800) / 2;
int y = (int) (height - 700) / 2;
frame.setBounds(x, y, 1000, 600);
frame.getContentPane().setBackground(Color.WHITE);
Font font = new Font("楷体", Font.BOLD, 20);
Object[] columnNames = new String[] { "课程编号", "名称", "时间", "教师", "教室" };
Object[][] data = data(semester);
DefaultTableModel model = new DefaultTableModel(data,columnNames) {
/**
*
*/
private static final long serialVersionUID = 1L;
public boolean isCellEditable(int row, int column) {
return false;
}
};
// 创建表格组件
JTable table = new JTable(model);
table.setModel(model);
// 设置表格只能选择一列
table.setColumnSelectionAllowed(true);
JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
frame.add(pane, BorderLayout.CENTER);
// 设置表格的数据行的高度
table.setRowHeight(30);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
每次数据更新,只需要调用方法就能实现数组内数据的更新,在查询部分我调用了另一个方法,实现了查询操作,我知道这一定不是最优解,由于点击按钮之后已经执行,所以表格不会更新,例如我添加完课程之后,数组虽然更新了,但表格不会显示,所以,又多了个“多余”的“更新”按钮来更新我的表格,可以说是伪实时更新了。
传入数据之后,还有对于表格的一些限制和修饰
// 设置表格头
JTableHeader header = table.getTableHeader();
// 设置表格头不允许重新排列
header.setReorderingAllowed(false);
header.setPreferredSize(new Dimension(0, 40));
header.setBackground(Color.BLACK);
header.setForeground(Color.WHITE);
header.setFont(new Font("微软雅黑", Font.BOLD, 24));
// 设置表格只能选择一列
table.setColumnSelectionAllowed(true);
// 设置表格的数据行的高度
table.setRowHeight(30);
table.setBackground(Color.WHITE);
// 设置每一列的文本的大小及对其方式
DefaultTableCellRenderer render = new DefaultTableCellRenderer();
render.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
render.setFont(new Font("微软雅黑", Font.BOLD, 24));
我最终的课程管理界面的实现效果如下;
[外链图片转存失败(img-7ocSZaQn-1568279029869)(C:\Users\Dell\AppData\Local\Temp\课程界面.png)]
HorizontalAlignment(DefaultTableCellRenderer.CENTER);
render.setFont(new Font(“微软雅黑”, Font.BOLD, 24));
我最终的课程管理界面的实现效果如下;