JAVA第三次作业

一丶简述

JTable是将数据以表格的形式显示给用户看的一种组件,它包括行和列,其中每列代表一种属性,例如:学号,姓名,成绩等等。而每行代表的是一个实体,例如一个学生。在JTable中,默认情况下列会平均分配父容器的宽度,你可以通过鼠标改变列的宽度,还可以交换列的排列顺。下面进入正题,介绍JTable的一些构造函数,JTable有许多构造函,这里只对部分构造函数和功能进行介绍。

二、构造一个 JTable

构造一个 JTable来显示二维数组rowData 中的值,其列名称为 columnNames。
代码如下:

public JTableTest()
{
    intiComponent();
}

/**
 * 初始化窗体组件
 */
private void intiComponent()
{
    /*
     * 设置JTable的列名
     */
    String[] columnNames =
            { "姓名", "学号", "性别", "工期", "学院", "学校" };

   
    Object[][] obj = new Object[2][6];
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 6; j++)
        {
            switch (j)
            {
                case 0:
                    obj[i][j] = "甲乙丙 ";
                    break;
                case 1:
                    obj[i][j] = "123456";
                    break;
                case 2:
                    obj[i][j] = "男";
                    break;
                case 3:
                    obj[i][j] = "十年";
                    break;
                case 4:
                    obj[i][j] = "计算机科学与应用数学学院";
                    break;
                case 5:
                    obj[i][j] = "xx学院";
                    break;
            }
        }
    }


    /*
     * JTable的其中一种构造方法
     */
    JTable table = new JTable(obj, columnNames);
    /*
     * 设置JTable的列默认的宽度和高度
     */
    TableColumn column = null;
    int colunms = table.getColumnCount();
    for(int i = 0; i < colunms; i++)
    {
        column = table.getColumnModel().getColumn(i);
        /*将每一列的默认宽度设置为100*/
        column.setPreferredWidth(100);
    }
    /*
     * 设置JTable自动调整列表的状态,此处设置为关闭
     */
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    /*用JScrollPane装载JTable,这样超出范围的列就可以通过滚动条来查看*/
    JScrollPane scroll = new JScrollPane(table);
    scroll.setSize(300, 200);


    add(scroll);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.pack();
}

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

运行结果如图:
在这里插入图片描述
以上这种构造方法,看起来没有用到TableModel,其实是系统帮我们自动生成了一个DefaultModel的实例,DefaultModel是TableModel的子类。每个JTabel都会有一个TableModel,这个TabelModel管理表格的数据,下面就来介绍定义自己的TableModel来实现自己的JTable.

三、构造一个JTable

构造一个JTable,使用数据模型dm、默认的列模型和默认的选择模型对其进行初始化。
代码如下:

/**
 * 初始化窗体组件 
 */
private void intiComponent()
{
    JTable table = new JTable(new MyTableModel());

    /* 用JScrollPane装载JTable,这样超出范围的列就可以通过滚动条来查看 */
    JScrollPane scroll = new JScrollPane(table);
    add(scroll);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.pack();
}

private class MyTableModel extends AbstractTableModel
{
    /*
     * 这里和刚才一样,定义列名和每个数据的值
     */
    String[] columnNames =
            { "姓名", "学号", "年龄", "成绩", "选择" };
    Object[][] data = new Object[2][5];

    /**
     * 构造方法,初始化二维数组data对应的数据 
     */
    public MyTableModel()
    {
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                if (0 == i)
                {
                    switch (j)
                    {
                        case 0:
                            data[i][j] = "甲";
                            break;
                        case 1:
                            data[i][j] = "20170101";
                            break;
                        case 2:
                            data[i][j] = "18";
                            break;
                        case 3:
                            data[i][j] = "90";
                            break;
                        case 4:
                            data[i][j] = new Boolean(false);
                            break;
                    }
                }
                if (1 == i)
                {
                    switch (j)
                    {
                        case 0:
                            data[i][j] = "乙";
                            break;
                        case 1:
                            data[i][j] = "20170102";
                            break;
                        case 2:
                            data[i][j] = "18";
                            break;
                        case 3:
                            data[i][j] = "63";
                            break;
                        case 4:
                            data[i][j] = new Boolean(false);
                            break;
                    }
                }
            }
        }
    }

    // 以下为继承自AbstractTableModle的方法,可以自定义  
    /**
     * 得到列名 
     */
    @Override
    public String getColumnName(int column)
    {
        return columnNames[column];
    }

    /**
     * 重写方法,得到表格列数 
     */
    @Override
    public int getColumnCount()
    {
        return columnNames.length;
    }

    /**
     * 得到表格行数 
     */
    @Override
    public int getRowCount()
    {
        return data.length;
    }

    /**
     * 得到数据所对应对象 
     */
    @Override
    public Object getValueAt(int rowIndex, int columnIndex)
    {
        return data[rowIndex][columnIndex];
    }

    /**
     * 得到指定列的数据类型 
     */
    @Override
    public Class<?> getColumnClass(int columnIndex)
    {
        return data[0][columnIndex].getClass();
    }

    /**
     * 指定设置数据单元是否可编辑.这里设置"姓名","学号"不可编辑 
     */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        if (columnIndex < 2)
            return false;
        else
            return true;
    }

    /**
     * 如果数据单元为可编辑,则将编辑后的值替换原来的值 
     */
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex)
    {
        data[rowIndex][columnIndex] = aValue;
        /*通知监听器数据单元数据已经改变*/
        fireTableCellUpdated(rowIndex, columnIndex);
    }

}

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

运行结果如下:
在这里插入图片描述
这里要指出的是每个数据单元的都有个cell renderer根据其数据类型将数据进行绘画显示出来。默认情况下boolean类型对应的是CheckBox对象,Object类型是将对象的字符显示出来,ImageIcon是将图片以lable形式显示出来等等.具体的可以查看API文档.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值