JTable
のカスタム拡張機能を使用するように並べ替え可能なAbstractTableModel
を設定しています。ただし、このテーブルの一部の動作は私が期待したものであり、これを理解する方法についてのアドバイスが大好きです。
JTableを使用してソート可能に設定しました。
thisJTable.setAutoCreateRowSorter(true);
これにより、期待どおりに列ヘッダーをクリックしてテーブルを並べ替えることができます。
ただし、列ヘッダーをクリックしてテーブルを並べ替えると、行の書式設定(背景と前景色)も並べ替えられないことがわかりました。
それらの行に含まれる値に基づいて色分けされるようにそれらの行を設定しました。列ヘッダーで並べ替えると、特定の行NUMBERの書式設定は同じままです(ただし、その行に以前あったコンテンツは移動しました)。
行の色は、JTableのデフォルトのprepareRenderer
呼び出しをオーバーライドすることによって設定されます。
thisTable = new JTable(thisModel){
//Set up custom rendering - Sets background color of row to correct value
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
CustTableModel thisModel = (CustTableModel) getModel();
c.setBackground(thisModel.getRowBackgroundColor(row));
c.setForeground(thisModel.getRowForeColor(row));
return c;
}
};
これに取り組むためのより良い/異なる方法はありますか?
レンダリングを実行するために別のメソッドを使用する必要がありますか?ソートでJTableのレンダリングを更新するメソッドですか?
それとも、独自の並べ替え方法の記述を検討したいですか?
ソリューション(ありがとうmKorbel!)
新しいインデックスがprepareRendererにも渡されるかどうかがわからなかったので、少し試してみなければならなかったので、自分の解決策を投稿すると思いました。
thisTable = new JTable(thisModel){
//Set up custom rendering - Sets background color of row to correct value
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
int viewIdx = row;
int modelIdx = convertRowIndexToModel(viewIdx);
Component c = super.prepareRenderer(renderer, row, column);
CustTableModel thisModel = (CustTableModel) getModel();
c.setBackground(thisModel.getRowBackgroundColor(modelIdx));
c.setForeground(thisModel.getRowForeColor(modelIdx));
return c;
}
};
int modelRow = convertRowIndexToModel(row);
このtable.setAutoCreateRowSorter(true);
を使用してヘッダーをクリックすると、テーブルの並べ替えを有効にできます
詳細については、このサイトにアクセスしてください http://www.codejava.net/Java-se/swing/6-techniques-for-sorting-jtable-you-should-know