ti-enxame.com

JTable ocultar e mostrar colunas

Eu quero adicionar algumas colunas a uma tabela (Swing JTable). Alguns deles terão um tamanho padrão (por exemplo, 250), outros serão ocultados (portanto, o tamanho será 0). Eu uso este código:

 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();
}

o problema é que quando a tabela é exibida, todas as colunas são exibidas (nenhuma está oculta) e seu tamanho não é 250, mas elas têm o mesmo tamanho.

Como posso obter o efeito desejado?

12
Randomize

JTable # removeColumn remove a coluna apenas da visualização JTable, mais neste exemplo

12
mKorbel

Eu acho que você nomeou seus métodos incorretamente, quando você deseja ocultar uma coluna, você definirá

column.setMinWidth(0);
column.setMaxWidth(0);
column.setPreferredWidth(0);

mas no seu código você está fazendo isso quando deseja mostrar uma coluna exatamente oposta.

Também não há necessidade de chamar esse método "setWidth" em um TableColumn, leia TableColumn # setWidth (int) .

16
mprabhat

em vez de reinventar a roda, você pode considerar usar o JXTable (em o projeto SwingX ) que suporta colunas ocultas, complete com um controle de interface do usuário para permitir que os usuários as ocultem/as mostrem dinamicamente - e um monte de outras coisinhas úteis :).

7
kleopatra

tente algo assim, por exemplo:

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);

Essa é a melhor maneira que eu sei para ocultar uma coluna.

6
august0490
    HashMap<String,TableColumn> hashMap_columns = new HashMap<String,TableColumn>();

    DefaultTableColumnModel defaultTableColumnModel = (DefaultTableColumnModel)jtable.getColumnModel();

    Enumeration<TableColumn> enumeration = defaultTableColumnModel.getColumns();

    while (enumeration.hasMoreElements())
    {
           TableColumn tableColumn = enumeration.nextElement();

           hashMap_columns.put((String)tableColumn.getIdentifier(),tableColumn);

    }


    public void setColumnVisible(String identifier, boolean setVisible)
    {
            TableColumn tableColumn = hashMap_columns.get(identifier);

            if (setVisible)
            {
                // using a sorted map removes the need to check column index/position
                SortedMap<Integer,TableColumn> sortedMap = new TreeMap<Integer,TableColumn>();

                // retreive all visible columns 
                Enumeration<TableColumn> enumeration = defaultTableColumnModel.getColumns();

                while (enumeration.hasMoreElements())
                {
                    TableColumn column = enumeration.nextElement();

                    sortedMap.put(column.getModelIndex(),column);
                }

                // add the column of interest to the sorted map
                sortedMap.put(tableColumn.getModelIndex(),tableColumn);

                // remove all visible columns
                for (TableColumn column: sortedMap.values())
                {
                    defaultTableColumnModel.removeColumn(column);
                }

                // add all previously visible columns as well as the column of interest
                for (TableColumn column: sortedMap.values())
                {
                    defaultTableColumnModel.addColumn(column);
                }
            }
            else
            {
                defaultTableColumnModel.removeColumn(tableColumn);
            }
        }
0
johnny
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);
        }
    }
}
0
Mahbubur Rahman Khan