1

RowSorter(Java 1.6) を使用している JTable があり、RowSorter が Java に追加されていないときに、Java 1.4 を使用して実装されたルック アンド フィールを使用しています。今私の問題は次のとおりです。テーブル ヘッダーをクリックすると、テーブルが並べ替えられますが、テーブル ヘッダーに RosSorter アイコンが表示されません。どうにかしてそのアイコンが必要なのですが、既存のルック アンド フィールをアップグレードできません。助けはありますか?

4

1 に答える 1

3

基本的なアプローチは、LAF によって提供されるレンダラーをラップし、レンダリング コンポーネントを構成させ、さらに必要に応じて並べ替えアイコンを描画させることです。何かのようなもの:

final TableCellRenderer r = table.getTableHeader().getDefaultRenderer();
TableCellRenderer wrapper = new TableCellRenderer() {

    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {
        Component comp = r.getTableCellRendererComponent(table, value, isSelected, 
            hasFocus, row, column);
        if (comp instanceof JLabel) {
            JLabel label = (JLabel) comp;
            label.setIcon(getSortIcon(table, column));
        }
        return comp;
    }

    /**
     * Implements the logic to choose the appropriate icon.
     */
    private Icon getSortIcon(JTable table, int column) {
        SortOrder sortOrder = getColumnSortOrder(table, column);
        if (SortOrder.UNSORTED == sortOrder) {
            return null;
        }
        return SortOrder.ASCENDING == sortOrder ? ascendingIcon : descendingIcon;
    }

    private SortOrder getColumnSortOrder(JTable table, int column) {
        if (table == null || table.getRowSorter() == null) {
            return SortOrder.UNSORTED;
        }
        List<? extends SortKey> keys = table.getRowSorter().getSortKeys();
        if (keys.size() > 0) {
            SortKey key = keys.get(0);
            if (key.getColumn() == table.convertColumnIndexToModel(column)) {
                return key.getSortOrder();
            }
        }
        return SortOrder.UNSORTED;
    }

};
table.getTableHeader().setDefaultRenderer(wrapper);

これは最も簡単なケースで、レンダリング コンポーネントが JLabel であり、そのアイコン プロパティを他の方法で使用しない場合に機能します。

于 2013-01-29T13:44:45.273 に答える