感受JTable 与 JTableModel

来源:互联网 发布:淘宝手包 编辑:程序博客网 时间:2024/04/27 03:33

          一期的毕业设计中用到了JTable控件,具体而言,是将数据库中的内容显示到JTable上,再将这个JTable控件加到一个JScrollPane(能滚动的面板)上 ,因为小组成员都要用到,所以我写了一个公用的类,只要把列名(是一个String数组)以及一个SQL的查询语句当作参数,调用这个类的jianbiao方法就能返回一个JPanel,另外还提供了返回JTable对象与DefaultTableModel对象的方法。颇为简单,下面就是这个类。

package chongyong;

import javax.swing.JTable;
import javax.swing.JScrollPane;
import java.awt.GridLayout;
import java.sql.ResultSet;
import java.awt.Cursor;
import java.sql.SQLException;
import javax.swing.JPanel;
import javax.swing.table.DefaultTableModel;
import java.util.Vector;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.BorderLayout;

/**
 * <p>Title: </p>
 *
 * <p>只要传入一个字符数组、一个SQL字符串就会返回以这字符串数组为列名以SQL字符串为内容的表格 </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class autojianbiao extends JPanel {
    JTable table;
    DefaultTableModel tableModel;

    //为了方面于大家给表格加一些属性,所以用此方法返回本类生成的JTable对象
    public JTable return_table() {
        return table;
    }
public DefaultTableModel return_table_model(){
return tableModel;
}

    //本类的构造方法
    public autojianbiao() {
        super();
    }


    public JPanel jianbiao(String[] columnNames, String sqlStr) {
        //表格列向量;
        Vector cell;

//表格行向量;
        Vector row = new Vector();

//声明表格模型;
        tableModel = new DefaultTableModel();

//将表格头转换过向量类型,以备表格模型使用;
        Vector tableHeadName = new Vector();

        for (int i = 0; i < columnNames.length; i++) {
            tableHeadName.add(columnNames[i]);
        }

//初始化表格数据,这些数据实例运行来源于数据库中;
        db db1 = new db();
        ResultSet rs = db1.select(sqlStr);

        try {

            while (rs.next()) {

                cell = new Vector();
                for (int i = 1; i <= columnNames.length; i++) {
                    cell.add(rs.getString(i));

                }
                row.add(cell);
            }
        } catch (SQLException ex) {
        }

//设置表格模型;
        tableModel.setDataVector(row, tableHeadName);

//表格使用模型;
        table = new JTable(tableModel);
//table.setRowHeight(20);

//new Cursor(1)设置鼠标指针样式,12为手形;
        table.setCursor(new Cursor(12));

//把表格加在scrollPane组件上;
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.getViewport().add(table);

//设置光标为手形;
        scrollPane.setCursor(new Cursor(12));

//定义面板;
        JPanel pan = new JPanel();
        pan.setLayout(new BorderLayout());
        pan.add(scrollPane);

//设置窗体

        pan.setSize(737, 160);
//把这个JPanel返回,以方便大家调用
        return pan;
    }

}

 

后来的使用过程中,我总结出很多问题,拿出来和大家分享:
一、我要实现单击这个表格的一行,点击删除按钮,就把这行删除。
       大家应该知道,要删除这行,首先得取获得点击的这行的行号,刚开始我用的inti=
tableModel.getSelectedRow(),i 就是这个行号,但是发现删除时并不能删除选择的行,解决方法:int i=table.getSelectedRow(),用table获取行号就是当前选中的行号,感觉是tableModel中还存一个副本,并不是
最新的表格样式。

二、要实现根据查询内容,变换Jtable中的内容
       刚开始的实现方法是利用查询语句,重新调用一次上面创建表格的类,把这个表格添加到滚动面板上,出现
的问题:当滚动条移动时,表格不显示查询出来的内容,而是重新显示建JFrame时初始内容。解决方式:不能
重新New 表格,应该是把表格作为参数传过来后,重新写一篇根据RS的内容构造表格内容的程序,改变当前表格的内容。
      所以在涉及到表格的操作里,当要根据增、删、改、查改变表格内容的时候,不要重新New表格,要改变
JtableModel,它提供了addRow()和removeRow方法,很好用。

原创粉丝点击