私は 1 つの JTable を使用した 1 つの GUI を設計しました。そこから 2 つの列を非表示にする必要があります。どうすればいいですか?
8 に答える
TableColumn
から を取り外しTableColumnModel
ます。
TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) );
データにアクセスする必要がある場合は、 を使用しますtable.getModel().getValueAt(...)
。
ユーザーが必要に応じて列を非表示/表示できるようにするより複雑なソリューションについては、Table Column Managerを確認してください。
最初にビューから列を削除します
table.removeColumn(table.getColumnModel().getColumn(4));
次に、モデルからデータを取得します。
table.getModel().getValueAt(table.getSelectedRow(),4);
注意すべきことの 1 つは、データを取得するときは、テーブルからではなくモデルから取得する必要があることです。
どちらも機能する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 によって次のように言及されていました。
私は同じ問題を抱えていましたが、使用しTableColumnModel
removColumn();
ているため役に立たないので、これを使用しました
table.getColumnModel().getColumn(0).setWidth(0);
table.getColumnModel().getColumn(0).setMinWidth(0);
table.getColumnModel().getColumn(0).setMaxWidth(0);
そして私にとってはうまくいきました。列0を非表示にし、そこから値を取得できます
最小、最大、および「通常」の幅を 0 に設定します。
jTable.getColumn("ABC").setMinWidth(0); // Must be set before maxWidth!!
jTable.getColumn("ABC").setMaxWidth(0);
jTable.getColumn("ABC").setWidth(0);
maxWidth
注: <を設定できないため、最初に ( javadocminWidth
)を変更する必要があります。についても同様です。minWidth
width
2 番目の方法は、すべてのメソッドを拡張TableColumnModel
およびオーバーライドして、モデルにこれら 2 つの列がないという錯覚を (JTable に対して) 作成することです。
したがって、列を非表示にするときは、テーブルが列数を要求するときに 1 少ない値を返す必要があり、列 X を要求するときは、列インデックスに +1 を追加する必要がある場合があります (左にあるかどうかによって異なります)。または非表示の列の右側) など。
新しいテーブル モデルがすべてのメソッド呼び出し (修正されたインデックスなどを含む) を実際の列モデルに転送し、JTable で新しいテーブル モデルを使用できるようにします。
私はそれらすべてを試しましたが、役に立ちません。最善の方法は、削除したい列を含まない新しいテーブル モデルを作成することです。これはあなたがそれを行う方法です:
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);
モデルのサブクラスを作成し、TableModel.getColumnCount
次のようにオーバーライドできます。
int getColumnCount() {
return super.getColumnCount()-2;
}
最後の 2 列は に表示されませんJTable
。