46

我设计了一个 GUI,在其中我使用了一个 JTable,我必须从中使 2 列不可见。我该怎么做?

4

8 回答 8

69

从. TableColumn_TableColumnModel

TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) );

如果您需要访问数据,那么您可以使用table.getModel().getValueAt(...).

对于允许用户根据需要隐藏/显示列的更复杂的解决方案,请查看Table Column Manager

于 2009-09-29T15:16:23.340 回答
39

首先从视图中删除列

 table.removeColumn(table.getColumnModel().getColumn(4));

然后从模型中检索数据。

table.getModel().getValueAt(table.getSelectedRow(),4);

需要注意的一点是,在检索数据时,必须从模型而不是表中检索数据。

于 2013-03-21T05:38:50.637 回答
20

我尝试了两种可行的解决方案,但第一个解决方案遇到了一些问题。

   table.removeColumn(table.getColumnModel().getColumn(4));

或者

   table.getColumnModel().getColumn(4).setMinWidth(0);
   table.getColumnModel().getColumn(4).setMaxWidth(0);
   table.getColumnModel().getColumn(4).setWidth(0);

在我最近的案例中,我更喜欢第二种解决方案,因为我添加了一个TableRowSorter

   TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
   table.setRowSorter(sorter);

使用时table.removeColumn(table.getColumnModel().getColumn(4)),它会从视图/表中物理删除该列,因此您无法使用table.getValueAt(row, 4)- 它返回ArrayIndexOutOfBounds。获取已删除列的值的唯一方法是调用table.getModel().getValueAt(table.getSelectedRow(),4). 由于TableRowSorter仅对表中的内容进行排序,而不对DefaultTableModel对象中的数据进行排序,因此问题是当您在对记录进行排序获取值时- 它将从DefaultModelObject中检索未排序的数据。

所以我使用了第二种解决方案,然后使用table.getValueAt(table.getSelectedRow(),4);

@camickr 提到了我在第二种方法中看到的唯一问题:“当您将宽度设置为 0 时,请尝试使用制表符,当您点击隐藏列时,焦点会消失,直到您再次使用制表符。这会使用户感到困惑。”

于 2012-05-03T06:31:13.333 回答
8

我有同样的问题,因为我正在使用TableColumnModel removColumn();并没有帮助我所以我使用了这个

table.getColumnModel().getColumn(0).setWidth(0);
table.getColumnModel().getColumn(0).setMinWidth(0);
table.getColumnModel().getColumn(0).setMaxWidth(0); 

对我来说工作得很好,它隐藏了第 0 列,我仍然能够从中获得价值

于 2016-01-26T23:03:38.243 回答
5

将最小、最大和“正常”宽度设置为 0:

jTable.getColumn("ABC").setMinWidth(0); // Must be set before maxWidth!!
jTable.getColumn("ABC").setMaxWidth(0);
jTable.getColumn("ABC").setWidth(0);

注意:由于您无法设置maxWidth< minWidth,因此您需要先更改minWidth, ( javadoc )。对于width.

第二种方法是扩展TableColumnModel和覆盖所有方法以创建模型没有这两列的错觉(对于 JTable)。

所以当你隐藏一列的时候,表求列数的时候一定要少回1,求列X的时候,可能要给列索引加+1(要看是不是在左边或隐藏列的右侧)等。

让您的新表模型将所有方法调用(使用更正的索引等)转发到实际的列模型,并在 JTable 中使用新的表模型。

于 2009-09-29T12:29:59.530 回答
0

如果从 中删除该列,JTable该列仍然存在于TableModel.

例如要删除第一个 ID 列:

TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn(tcm.getColumn(0));

如果要访问已删除列的值,则必须通过 的getValueAt函数而TableModel不是JTable. 但是您必须将模型中的 rowIndex 转换回 rowIndex。

例如,如果您想访问所选行的第一列:

int modelRow = table.convertRowIndexToModel(table.getSelectedRow());
int value = (Integer)table.getModel().getValueAt(modelRow,0);
于 2019-04-06T08:22:57.027 回答
-3

我都试过了:它们没有帮助。最好的方法是创建一个没有要删除的列的新表模型。这就是你的做法:

table = (DefaultTableModel) <table name>.getModel();
DefaultTableModel table1 = new DefaultTableModel();
Vector v = table.getDataVector();
Vector v1 = newvector(v,<column index you want to delete>);

Vector newvector(Vector v,int j){
    Vector v1= new Vector();
    try{
        Vector v2;
        Object[] o = v.toArray();
        int i =0;
        while(i<o.length){
            v2 = (Vector) o[i];
            v2.remove(j);
            v1.add(v2);
            i++;
        }
    }
    catch(Exception e){
        JOptionPane.showMessageDialog(null,"Error in newvector \n"+e);
    }
    return v1;
}

Vector getColumnIdentifiers(int i) {
    Vector columnIdentifiers = new Vector();
    int j=0;
    while(j<i){
        columnIdentifiers.add(("c"+(j+1)));
        j++;
    }
    return columnIdentifiers;
}
table1.setDataVector(v1,getColumnIdentifiers((<column count>-1)));
<table name>.setModel(table1);
于 2012-08-18T17:17:53.177 回答
-4

您可以创建模型的子类,TableModel.getColumnCount并按如下方式覆盖:

int getColumnCount() {
    return super.getColumnCount()-2;
}

最后两列将不会显示在JTable.

于 2009-09-29T12:30:56.647 回答