Java+Swing+Mysql学生成绩管理系统(DAY 8)

Java+Swing+Mysql学生成绩管理系统(DAY 8)

问题引入

JTable中有哪些方法

如何存放表头

如何存放表格体(数据)

如何设置表头/表格体的属性(颜色、大小、字体)

如何设置字体居中显示

如何使表格不可被编辑

界面展示

Java+Swing+Mysql学生成绩管理系统(DAY 8)_第1张图片

代码实现

package com.test;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.util.Vector;

public class TableTest extends JFrame {

    public TableTest() {
        super("测试jTable");

//        //定义属性列(表头)
//        Vector columns=new Vector<>();
//        columns.addElement("编号");
//        columns.addElement("姓名");
//        columns.addElement("学号");
//        columns.addElement("家乡");

        //定义一个二维数组作为表格体,存放数据
        Vector<Vector<Object>> data = new Vector<>();
        Vector<Object> rowVector1 = new Vector<>();
        rowVector1.addElement("1");
        rowVector1.addElement("张三");
        rowVector1.addElement("1");
        rowVector1.addElement("湖南");

        Vector<Object> rowVector2 = new Vector<>();
        rowVector2.addElement("2");
        rowVector2.addElement("李四");
        rowVector2.addElement("2");
        rowVector2.addElement("北京");

        Vector<Object> rowVector3 = new Vector<>();
        rowVector3.addElement("3");
        rowVector3.addElement("王五");
        rowVector3.addElement("3");
        rowVector3.addElement("上海");

        data.addElement(rowVector1);
        data.addElement(rowVector2);
        data.addElement(rowVector3);


        //tableModel:和jTable关联后只需要更新model就能把数据的变化反应到jTable中
//        DefaultTableModel tableModel=new DefaultTableModel();
//        tableModel.setDataVector(data,columns);//将数据和属性列放到tableModel中
        //有了自定义的StudentTableModel,而且再其中封装表头信息
        StudentTableModel studentTableModel = StudentTableModel.assembleModel(data);
        //jTable和model关联
        JTable jTable = new JTable(studentTableModel);
        //设置表头的属性(字体,颜色)
        JTableHeader tableHeader = jTable.getTableHeader();
        tableHeader.setFont(new Font(null, Font.BOLD, 16));
        tableHeader.setBackground(Color.pink);
        //设置表格体
        jTable.setFont(new Font(null, Font.PLAIN, 14));
        jTable.setBackground(Color.WHITE);
        jTable.setGridColor(Color.BLACK);//设置表格分割线为纯黑色
        jTable.setRowHeight(30);//设置行高
        //设置是否可以多行选择(默认就是多行选择)
        jTable.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        //设置每一列的渲染方式
        Vector<String> columns=StudentTableModel.getColumns();//获取每一列
        StudentCellRender render =new StudentCellRender();//设置渲染方式
        for(int i=0;i<columns.size();i++){
            TableColumn column=jTable.getColumn(columns.get(i));
            column.setCellRenderer(render);
            if(i==0){//设置第一列的宽度
                column.setPreferredWidth(30);
                column.setResizable(false);//设置第一列的宽度不可改变
            }
        }

        Container contentPane = getContentPane();
        /*如果直接把jTable加到contentPane内容面板上,将不会显示属性列(表头)
        应该先加到加到JScrollPane上再加到面板上
        JTable通常置于一个内部JScrollPane 。
         */
        JScrollPane jScrollPane = new JScrollPane(jTable);//
        contentPane.add(jScrollPane);


        setSize(600, 400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] main) {
        new TableTest();
    }
}

/*
为了设置表格体中的数据居中且增加渲染方式,重写getListCellRendererComponent方法
 */
class StudentCellRender extends DefaultTableCellRenderer{
    //在每一行的每一列显示之前都会调用
    //隔行变色
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (row % 2 == 0) {
            setBackground(Color.gray);
        }else{
            setBackground(Color.WHITE);
        }
        //居中显示
        setHorizontalAlignment(DefaultListCellRenderer.CENTER);
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
}

/*自定义StudentTableModel
为了设置表格体中数据不够被修改,我们需要重写DeFaultTableModel中
的方法 boolean isCellEditable(int row, int column)
因此我们需要继承
除此之外我们的表头的信息是固定的不可变的,可以封装再自定义的StudentTableModel中,并设为静态
 */
class StudentTableModel extends DefaultTableModel{
    //定义属性列(表头)
    static Vector<String> columns=new Vector<>();
    static{
        columns.addElement("编号");
        columns.addElement("姓名");
        columns.addElement("学号");
        columns.addElement("家乡");
    }
    //构造函数私有化防止外部重写对象
    private StudentTableModel(){
        super(null,columns);//初始状态表格体为空,表头固定
    }

    private static StudentTableModel studentTableModel=new StudentTableModel();
    public static StudentTableModel assembleModel(Vector<Vector<Object>> data){
        studentTableModel.setDataVector(data,columns);
        return studentTableModel;
    }

    public static Vector<String> getColumns() {
        return columns;
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;//false不可编辑
    }
}

你可能感兴趣的:(java图形化界面编程,java,mysql,开发语言)