web-dev-qa-db-ja.com

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

問題は、テーブルが表示され、すべての列が表示され(どれも非表示ではない)、サイズが250ではないが、すべて同じサイズである場合です。

必要な効果を得るにはどうすればよいですか?

12
Randomize

JTable#removeColumn JTableビューからのみ列を削除します。詳細は example

12
mKorbel

あなたが設定した列を非表示にしたいとき、あなたはあなたのメソッドに間違った名前を付けたと思います

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

しかし、あなたのコードでは、正反対の列を表示したいときにこれを行っています。

また、TableColumnでこの「setWidth」メソッドを呼び出す必要はありません。 TableColumn#setWidth(int) をお読みください。

16
mprabhat

ホイールを再発明する代わりに、非表示の列をサポートするJXTable( SwingXプロジェクト )を使用することを検討するかもしれません。他の便利なもの:)。

7
kleopatra

たとえば、次のようなものを試してください。

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

これが、列を非表示にするための最良の方法です。

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