20

のカスタム拡張機能を使用するためのソート可能な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;
    }
};
4

2 に答える 2

19

行インデックスをビューからモデルに変換する必要があります

int modelRow = convertRowIndexToModel(row);
于 2012-04-25T17:53:49.300 に答える
4

これを使用してヘッダーをクリックすると、テーブルの並べ替えを有効にできます table.setAutoCreateRowSorter(true);

詳細については、このサイトを参照してください http://www.codejava.net/java-se/swing/6-techniques-for-sorting-jtable-you-should-know

于 2016-05-01T19:50:59.700 に答える