如何在JTable Invisible for Swing Java中创建一个列

时间:2009-09-29 12:23:09

标签: java swing jtable invisible

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

8 个答案:

答案 0 :(得分:61)

TableColumn删除TableColumnModel

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

如果您需要访问数据,请使用table.getModel().getValueAt(...)

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

答案 1 :(得分:34)

首先从视图中删除列

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

然后从模型中检索数据。

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

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

答案 2 :(得分:15)

我尝试了两种可行的解决方案,但都解决了第一种解决方案。

   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时,尝试使用Tab键,当您点击隐藏列时,焦点会消失,直到您再次选中。这会让用户感到困惑。“

答案 3 :(得分:6)

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

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

并且对我来说很好,它隐藏了第0列,我仍然可以从中获得价值

答案 4 :(得分:0)

如果您从@ApiOperation("Create new something") @ApiResponses(value = { @ApiResponse(code = 201, message = "New something successfully created"), @ApiResponse(code = 400, message = "Bad request, adjust before retrying", response = SpringErrorPayload.class), @ApiResponse(code = 500, message = "Internal Server Error", response = SpringErrorPayload.class ) }) @ResponseStatus(CREATED) public SomethingPayload createSomething(@Valid @RequestBody final NewSomethingPayload newSomethingPayload) { return somethingService.createSomething(newSomethingPayload); } 中删除该列,则该列仍会出现在JTable中。

例如,删除第一个ID列:

TableModel

如果要访问已删除列的值,则必须通过TableColumnModel tcm = table.getColumnModel(); tcm.removeColumn(tcm.getColumn(0)); 的{​​{1}}函数而不是getValueAt来访问它。但是您必须将模型中的rowIndex转换回rowIndex。

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

TableModel

答案 5 :(得分:-2)

将min,max和“normal”宽度设置为0:

jTable.getColumn("ABC").setWidth(0);
jTable.getColumn("ABC").setMinWidth(0);
jTable.getColumn("ABC").setMaxWidth(0);

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

因此,当您隐藏列时,必须在表要求列数时少返回一列,并且当它要求列X时,您可能必须向列索引添加+1(取决于它是否为在隐藏列的左侧或右侧)等。

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

答案 6 :(得分:-3)

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

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

最后两列不会显示在JTable

答案 7 :(得分:-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);