Java JTable隐藏和显示列

Java JTable隐藏和显示列,java,swing,jtable,Java,Swing,Jtable,我想向表中添加一些列(Swing JTable)。其中一些将具有默认大小(例如250),其他将被隐藏(因此其大小将为0)。我使用以下代码: model = new DefaultTableModel(); table = new JTable(model); setAutoResizeMode(AUTO_RESIZE_OFF); for (int i = 1; i < COLUMN_NAMES.length; i++) { model.addColumn(COLUMN_NA

我想向表中添加一些列(Swing JTable)。其中一些将具有默认大小(例如250),其他将被隐藏(因此其大小将为0)。我使用以下代码:

 model = new DefaultTableModel();
 table = new JTable(model);
 setAutoResizeMode(AUTO_RESIZE_OFF);
 for (int i = 1; i < COLUMN_NAMES.length; i++) {
    model.addColumn(COLUMN_NAMES[i]);
    if (show[i]) show(index);
    else hide(index);
 }
 ........

 private void hide(int index) {
    TableColumn column = getColumnModel().getColumn(index);
    column.setMinWidth(0);
    column.setMaxWidth(0);
    column.setWidth(0);
    column.setPreferredWidth(0);
    doLayout();
}

private void show(int index) {
    final int width = 250;
    column.setMinWidth(15);
    column.setMaxWidth(width);
    column.setWidth(width);
    column.setPreferredWidth(width);
    doLayout();
}
model=newdefaulttablemodel();
表=新JTable(型号);
设置AutoResizeMode(自动调整大小关闭);
对于(int i=1;i
问题是当显示表时,所有列都会显示(没有隐藏),它们的大小不是250,但它们的大小都相同


如何获得想要的效果?

我认为您的方法命名不正确,当您要隐藏将要设置的列时

column.setMinWidth(0);
column.setMaxWidth(0);
column.setPreferredWidth(0);
但是在你的代码中,当你想显示一个正好相反的列时,你就这样做了


也不需要在表列上调用这个“设置宽度”方法,读取.< /p> 只从JTabVIEW中删除列,更多的是在这个

< P>中,而不是重新创建轮子,可以考虑使用支持隐藏列的JXTABLE(IN),使用ui控件完成,允许用户动态隐藏/显示它们以及其他一些有用的内容:)。

HashMap\u columns=new HashMap();
DefaultTableColumnModel DefaultTableColumnModel=(DefaultTableColumnModel)jtable.getColumnModel();
枚举枚举=defaultTableColumnModel.getColumns();
while(枚举.hasMoreElements())
{
TableColumn TableColumn=枚举.nextElement();
hashMap_columns.put((字符串)tableColumn.getIdentifier(),tableColumn);
}
public void setColumnVisible(字符串标识符,布尔setVisible)
{
TableColumn TableColumn=hashMap\u columns.get(标识符);
如果(设置为可见)
{
//使用排序映射可以消除检查列索引/位置的需要
SortedMap SortedMap=新树映射();
//检索所有可见列
枚举枚举=defaultTableColumnModel.getColumns();
while(枚举.hasMoreElements())
{
TableColumn column=enumeration.nextElement();
sortedMap.put(column.getModelIndex(),column);
}
//将感兴趣的列添加到已排序的映射中
sortedMap.put(tableColumn.getModelIndex(),tableColumn);
//删除所有可见列
for(TableColumn列:sortedMap.values())
{
defaultTableColumnModel.removeColumn(列);
}
//添加所有以前可见的列以及感兴趣的列
for(TableColumn列:sortedMap.values())
{
defaultTableColumnModel.addColumn(column);
}
}
其他的
{
defaultTableColumnModel.removeColumn(tableColumn);
}
}

试试这样的方法,例如:

myTableModel = new DefaultTableModel();
myTableModel.setColumnIdentifiers(new Object[]{"ID", "Name"});
JTable myTable = new JTable(myTableModel);

// remember to save the references
TableColumn myTableColumn0 = guiLoteryNumbersTable.getColumnModel().getColumn(0);
TableColumn myTableColumn1 = guiLoteryNumbersTable.getColumnModel().getColumn(1);
//...

// remove temporary the column ("hide")
myTable.getColumnModel().removeColumn(myTableColumn1);

// then you restore that column when you need it ("show")
myTable.getColumnModel().addColumn(myTableColumn1);
这是我知道的隐藏列的最好方法。

公共类TableColumnHider{
public class TableColumnHider {

    private final JTable table;
    private final TableColumnModel tcm;
    private final Map hiddenColumns;

    public TableColumnHider(JTable table) {
        this.table = table;
        tcm = table.getColumnModel();
        hiddenColumns = new HashMap();
    }

    public void hide(String columnName, String keySig) {
        int index = tcm.getColumnIndex(columnName);
        TableColumn column = tcm.getColumn(index);
        hiddenColumns.put(columnName, column);
        hiddenColumns.put(keySig + columnName, new Integer(index));
        tcm.removeColumn(column);
    }

    public void show(String columnName, String keySig) {
        Object o = hiddenColumns.remove(columnName);
        if (o == null) {
            return;
        }
        tcm.addColumn((TableColumn) o);
        o = hiddenColumns.remove(keySig + columnName);
        if (o == null) {
            return;
        }
        int column = ((Integer) o).intValue();
        int lastColumn = tcm.getColumnCount() - 1;
        if (column < lastColumn) {
            tcm.moveColumn(lastColumn, column);
        }
    }
}
专用最终JTable表; 私家中医药; 私有最终映射隐藏列; 公共表ColumnHider(JTable表){ this.table=表格; tcm=table.getColumnModel(); hiddenColumns=newHashMap(); } 公共void隐藏(字符串columnName、字符串keySig){ int index=tcm.getColumnIndex(columnName); TableColumn column=tcm.getColumn(索引); hiddenColumns.put(columnName,column); put(keySig+columnName,新整数(索引)); tcm.removeColumn(柱); } public void show(字符串columnName,字符串keySig){ 对象o=hiddenColumns.remove(columnName); 如果(o==null){ 返回; } tcm.addColumn((TableColumn)o); o=hiddenColumns.remove(keySig+columnName); 如果(o==null){ 返回; } int列=((整数)o).intValue(); int lastColumn=tcm.getColumnCount()-1; if(列<最后一列){ tcm.moveColumn(最后一列,第列); } } }
请看一看Swing genius StanislavL在这里的回答:谢谢,这不是完美的解决方案,因为它错过了示例中的顺序位置,但我修复了它。嘿,伙计们,如果你们不说为什么我的答案是错的,请不要投我反对票。一篇帖子对另一个非常相似的问题给出了相似的答案,结果被投了赞成票。不管怎样,我的方法很管用,试试看。最有可能的原因是答案迟了3年。这可能很好,但当答案只是3年前被接受的答案的细化时就不行了。嗨,column.setPreferredWidth(0);没有必要。我添加了:column.setresizeable(false);在调整左侧列的大小时避免混淆。
public class TableColumnHider {

    private final JTable table;
    private final TableColumnModel tcm;
    private final Map hiddenColumns;

    public TableColumnHider(JTable table) {
        this.table = table;
        tcm = table.getColumnModel();
        hiddenColumns = new HashMap();
    }

    public void hide(String columnName, String keySig) {
        int index = tcm.getColumnIndex(columnName);
        TableColumn column = tcm.getColumn(index);
        hiddenColumns.put(columnName, column);
        hiddenColumns.put(keySig + columnName, new Integer(index));
        tcm.removeColumn(column);
    }

    public void show(String columnName, String keySig) {
        Object o = hiddenColumns.remove(columnName);
        if (o == null) {
            return;
        }
        tcm.addColumn((TableColumn) o);
        o = hiddenColumns.remove(keySig + columnName);
        if (o == null) {
            return;
        }
        int column = ((Integer) o).intValue();
        int lastColumn = tcm.getColumnCount() - 1;
        if (column < lastColumn) {
            tcm.moveColumn(lastColumn, column);
        }
    }
}