jTable的隐藏问题

来源:百度知道 编辑:UC知道 时间:2024/07/02 17:44:45
/*隐藏jTable的某一列 */
TableColumn hideColumn = jTable1.getColumn("ID");
TableColumnModel tcm = jTable1.getColumnModel();

//隐藏
tcm.removeColumn(hideColumn);
jTable1.sizeColumnsToFit(-1);
/*

这几句代码是我从网上看到的,用来隐藏jTable的某一列的,没用这几句话的时候jTable能正常显示,但是用了之后就会抛出数组出界的异常。提示的是在这几行代码出现的异常:

jTable1.getColumnModel().getColumn(0).setMinWidth(2);
jTable1.getColumnModel().getColumn(1).setMinWidth(8);
jTable1.getColumnModel().getColumn(2).setMinWidth(8);
jTable1.getColumnModel().getColumn(3).setMinWidth(8);
jTable1.getColumnModel().getColumn(4).setMinWidth(8);
jTable1.getColumnModel().getColumn(5).setMinWidth(2);
jTable1.getColumnModel().getColumn(6).setMinWidth(8);
jTable1.getColumnModel().getColumn(7).setMinWidth(12);
jTable1.getColumnMode

我说下我试过以后的结论吧:
1.网上的代码没有错,通过那样可以成功。不过根据java api,sizeColumnsToFit方法已经废弃,你应该用table.doLayout();
2.你下面抛异常的一句话不可能是每句话都抛异常吧,抛异常的应该只有一句。而且异常信息肯定告诉是确切的行数,为什么要贴那么多呢,这是其一。其二,数组越界是因为你已经删除了一列,而你还认为有15列,那么当你访问索引为14的列时肯定是越界了。关键在于,你是用删除的方式来实现隐藏,这是两个概念,虽然在用户看来是一样的效果,但对你而言,前者是删掉了一列,本来有15列,现在是有14列了,后者是内存中的jtable模型依然保存着15列的数据,只是在绘制的时候不画出来而已。
3.如果你需要频繁的隐藏,显示某些列的话,这样做可能就有点不好,因为一列删除了,那么数据也就没了,你需要自己保存着,以便以后再添加这列。我认为JTable类可能有更好的办法使其不画某列而并不删除其数据,不过这一点,我暂时无能为力。。
4.关于你的最后一个问题,我想问:这些设置列宽的语句是在初始化的时候执行的吧?本来有现在没的是最后一列么?如果是的话就很好解释了,举个例子:
你本来有3列:
tc1.setMinWidth(1);
tc2.setMinWidth(2);
tc3.setMinWidth(3);
注意,tc1,tc2,tc3都是TableColumn的对象
现在你为了不抛异常,而注释掉了tc3.setMinWidth(3);
那么你想tc3代表的那列还会显示吗?再加上你删掉一列,比如tc2,那最后只会显示一列了。

问题在于,你认为getColumn(int)是和索引绑定,当删除一列后,那些列宽也会相应的往前移,但实际上,列宽的数值是和某一特定列的对象绑定。你一开始是有15列的,那么getColumn(13)只是设置那时第14列的列宽,删掉一列以后,那一列变成了第13列,那时列宽不会变。关于这点,只是猜测,没试验过。。