本人是从JTable开始学习Java的,尝到了JTable与TableModel配合的甜头后,让我对Java死心塌
地,当然有时偶尔也会用用Delphi。    
    随着程序的深入,我发现JTable的功能越来越不能满足需求了,这里想向大家请教一下JTable的较复杂的使用。
    1、JTable的值变化响应事件如何实现,tableChanged方法写起来麻烦不说,死循环似乎也不能得到很方便有效地解决。死循环的原因如表中有三列:单价、件数、总计。当我输入件数时计算总计,输入总计时计算件数。这类需求很常见,不知道都用的什么妙计解决的。我是在TableModel中实现的,但是代码写得太死,扩展或修改不太容易。
    2、多表头。这个可能是表格使用中最常用到的,涉及到表各种数据统计,多表头可能是最好的表现形式。到现在我没发现任何一种通用的多表头,不知道有没有人有这类代码。其实多表头要实现也不难,难的是随着的一些附属功能,如导出数据。如果谁有比较好用的多表头实现方式,而且能提供较方便得导出功能,望赐教,谢谢。    
    3、表格数据的导入,批量数据输入时,客户会苦苦哀求要导入功能。poi导入我确实有点嫌他太大,不知道还有什么简单好用的导入方式没?
    4、表头列任意变换。这个也常遇到,我的实现方式是修改表模型中列,这样的话原有的表格绘制器得重新设置,不知道有没有更好的方法。
    至于表格与数据库记录对应维护,表中单元格的合并,我通过网络都已经找到了比较好地解决方案。这里就不说了,如果有兴趣可以一起讨论。
    鲜花鸡蛋无所谓,参与讨论者,有分。

解决方案 »

  1.   

    相当有技术含量~~JTABLE一直在用~~用深了却没有~~希望有人提供相关解释~~期待~
      

  2.   

    1.不太了解lz的具体问题2、3感觉是lz使用poi所遇到的问题,当遇到多表头时,poi是可以设置合并cell的
    3的问题是比较棘手,如果客户比较通融,可以采取先用excel生成带有分隔符的txt文本文件,之后就好处理了,另外excel是可以直接导入一些数据库的还有jxl也可以尝试,没有用过,不发表意见4、没有实现,应该要新定义TableColumn对象
      

  3.   

    有一本swinghack的书,里面有不少jtable的高级用法,不妨看看。
      

  4.   

    1、tableChanged方法本人觉得不麻烦,死循环有两个解决方案:(1)得到被改变的单元格,if(此格改变)令一格改变;另一格改变会触发tableChanged,但是它不满足if(此格改变),所以不会死循环
    (2)改写TableModel,自己写一个mySetValueAt,代码则是setValueAt的代码去掉fire什么的那行,也就是不发出通知。用此法表格也不会自动刷新,请自行使用JTable.Repaint();刷新
    2、多表头。什么意思?没看懂。  
    3、表格数据与xls的互导,用POI,不算太麻烦。两层for,不到20行代码。
    4、表头列任意变换。DefaultTableModel.setColumnIdentifiers(Object[] col),要不要重新设置render,不太清楚
    合并单元格我不会,望赐教
      

  5.   

    package com.geostar.client.geosurfEditor;/**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2007</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.util.Vector;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;public class jTable extends JFrame {
        JTable table = new JTable();
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;    public jTable() {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver"); //驱动申明
                con = DriverManager.getConnection(
                        "jdbc:oracle:thin:@cdfn01:1521:cdfn01", "erpcn", "erpcn"); //建立链接
                String sql = "select * from emp"; //查询语句
                pstmt = con.prepareStatement(sql);
                rs = pstmt.executeQuery();
            } catch (Exception e) {
                System.out.println(e.toString());
            }
            ((DefaultTableModel) table.getModel()).setDataVector(getdata(),
                    gettitle());
            JScrollPane jsp = new JScrollPane(table);
            getContentPane().add(jsp);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            pack();
            setVisible(true);
        }    private Vector gettitle() {
            try {
                ResultSetMetaData rsm = rs.getMetaData();
                Vector title = new Vector();
                for (int i = 1; i <= rsm.getColumnCount(); i++) {
                    title.add(rsm.getColumnName(i));
                }
                return title;
            } catch (Exception e) {
                System.out.println(e.toString());
            }
            return new Vector();
        }    private Vector getdata() {
            try {
                ResultSetMetaData rsm = rs.getMetaData();
                Vector data = new Vector();
                while (rs.next()) {
                    Vector row = new Vector();
                    for (int i = 1; i <= rsm.getColumnCount(); i++) {
                        row.add(rs.getObject(i));
                    }
                    data.add(row);
                }
                return data;
            } catch (Exception e) {
                System.out.println(e.toString());
            }
            return new Vector();
        }    public static void main(String args[]) {
            new jTable();
        }
    }
      

  6.   

    建议用JCLass产品.里面提供的关于Table的控件,相当好用.可以满足所有的需求.而且扩展比较容易.
      

  7.   

    很早的时候多表头确实用的比较多,不过现在这个功能完全可以用TreeTable来实现,无论是swing还是swt都有这些个控件,我个人比较倾向使用swing,swingx的JXTreeTable用起来很不错,可以看一下demo:http://www.swinglabs.org/
      

  8.   

    呵呵 hs987654321 很厉害
    我也差不多是从JTable开始做界面的
    tableHeader
    tableModel
    tableCellRenderer
    tableSorter
    tablerCellEditor
    ....
    treeTable
    .....
    每完成新需求时,都感觉又长进了不少,有时甚至觉得自己去table了如指掌了,但后来总是发现还很多地方自己没注意到的...现在觉得JTree还要复杂,太过于臃肿了
      

  9.   

    顺便说一句,treeTable可以参考官方的第二个example,感觉不是很好,基本可以满足要求,第一个example就不行了
      

  10.   

    呵呵不厉害
    这几天老板要求多行tableHeader及他们的合并,头疼死了
    Cell的合并刚找到例子还没看懂呢,又来Header的
      

  11.   

    也正在用这个东西。
    跟vector配合着用
    还是不太明白。
    好多功能都不会实现
    希望大家能提供些资料及源码
    谢谢
      

  12.   

    去搜一下GroupableTableHeader吧,实现多表头
      

  13.   

    用JTabbedPane可以解决多表头的问题,导入的有多种文件操作啊,自己去看,常用的有jxl,关于死循环,可以使用线程....暂时就说这么多