学生选课系统—Swing+MySQL(二)

学生选课系统—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));

我最终的课程管理界面的实现效果如下;

学生选课系统—Swing+MySQL(二)_第1张图片

你可能感兴趣的:(项目总结)