46

私は 1 つの JTable を使用した 1 つの GUI を設計しました。そこから 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);

注意すべきことの 1 つは、データを取得するときは、テーブルからではなくモデルから取得する必要があることです。

于 2013-03-21T05:38:50.637 に答える
20

どちらも機能する2つの解決策を試しましたが、最初の解決策で問題が発生しました。

   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を追加したため、2 番目のソリューションを好みました。

   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からデータが取得されます。

だから私は2番目のソリューションを使用してから使用しましたtable.getValueAt(table.getSelectedRow(),4);

2 番目のアプローチで見られる唯一の問題は、@camickr によって次のように言及されていました。

于 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注: <を設定できないため、最初に ( javadocminWidth )を変更する必要があります。についても同様です。minWidthwidth

2 番目の方法は、すべてのメソッドを拡張TableColumnModelおよびオーバーライドして、モデルにこれら 2 つの列がないという錯覚を (JTable に対して) 作成することです。

したがって、列を非表示にするときは、テーブルが列数を要求するときに 1 少ない値を返す必要があり、列 X を要求するときは、列インデックスに +1 を追加する必要がある場合があります (左にあるかどうかによって異なります)。または非表示の列の右側) など。

新しいテーブル モデルがすべてのメソッド呼び出し (修正されたインデックスなどを含む) を実際の列モデルに転送し、JTable で新しいテーブル モデルを使用できるようにします。

于 2009-09-29T12:29:59.530 に答える
-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;
}

最後の 2 列は に表示されませんJTable

于 2009-09-29T12:30:56.647 に答える