のカスタム拡張機能を使用するためのソート可能なJTable
セットアップがありAbstractTableModel
ます。ただし、このテーブルの一部の動作は私が予想したものであり、これを理解する方法についてアドバイスをいただければ幸いです。
以下を使用してソート可能になるように JTable を設定しました。
thisJTable.setAutoCreateRowSorter(true);
これにより、期待どおりに列ヘッダーをクリックしてテーブルを並べ替えることができます。
ただし、列ヘッダーをクリックしてテーブルを並べ替えると、行の書式設定 (背景色と前景色) も並べ替えられないことがわかりました。
これらの行は、含まれる値に基づいて色分けされるように設定しました。列ヘッダーで並べ替えると、特定の行 NUMBER の書式設定は同じままです (ただし、以前にその行にあったコンテンツは移動しました)。
prepareRenderer
行の色は、JTableのデフォルトの呼び出しをオーバーライドすることによって設定されます。
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;
}
};