2

次のコードを使用しています。

public final class TableCellRendererCenter extends DefaultTableCellRenderer {

    public static final TableCellRenderer INSTANCE
            = new TableCellRendererCenter();

    protected TableCellRendererCenter() {

        // Calling super
        super();

        this.setHorizontalAlignment(SwingConstants.CENTER);

    }

}

JTable 列:

    TableColumnModel retrMod = ChartItemsTable.getColumnModel();
    TableColumn retrCol = retrMod.getColumn(2);

    retrCol.setHeaderRenderer(TableCellRendererCenter.INSTANCE);
    retrCol.setCellRenderer(TableCellRendererCenter.INSTANCE);

ルック アンド フィールが他の列ヘッダーと一致しなくなりました。

ここに画像の説明を入力

なんで?この問題を解決するにはどうすればよいですか?

編集

NetBeans はDefaultTableCellHeaderRendererどちらから来たものを使用しているようですpackage sun.swing.table;

私は太陽のパッケージを使うべきではないことをどこでも読みました。うーん...これは役に立ちません!

編集2

0verbose の提案により、以下が生成されます。

ここに画像の説明を入力

解決

オイゲナーの提案に従って、コードを次のように更新しました。

public final class TableCellRendererCenter extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {

        // returns component used for default header rendering
        // makes it independent on current L&F

        Component retr = table.getTableHeader().getDefaultRenderer().
            getTableCellRendererComponent(
                table, value, isSelected, hasFocus, row, column);

        if ( JLabel.class.isAssignableFrom(retr.getClass()) ) {

            JLabel jl = (JLabel) retr;
            jl.setHorizontalAlignment(SwingConstants.CENTER);

        }

        return retr;

    }

    @Override
    public void validate() {}

    @Override
    public void revalidate() {}

    @Override
    public void firePropertyChange(
        String propertyName, boolean oldValue, boolean newValue) {}

    @Override
    public void firePropertyChange(
        String propertyName, Object oldValue, Object newValue) {}

}

そして、私はこれを取得します:

ここに画像の説明を入力

ルック アンド フィールは保持され、列ヘッダーは中央に配置されます !!! (他の列ヘッダーも中央に配置されますが、int row, int columnパラメーターをさらにテストすることでこれを制御できます)。

4

2 に答える 2

5

問題は、LAF で使用されているものとは異なるセル レンダラーを使用していることです。IMO で適切な LAF を実現する唯一の方法は、次のようなLAF 自体によって既に提供されているレンダラーを使用することです。

public class TableHeaderRenderer extends JComponent implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                        boolean hasFocus, int row, int column) {

                // returns component used for default header rendering
                // makes it independent on current L&F

        return table.getTableHeader().getDefaultRenderer().
                          getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        }

        // following methods are overriden for performance reasons

        @Override
        public void validate() {}

        @Override
        public void revalidate() {}

        @Override
        public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}

        @Override
        public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}

}

明らかに、適切なレンダラーを取得したら、それを JLabel にキャストし (もちろん、それがそうであることを確認した後)、テキストを中央に配置するか、何か他のことを行うことができます。

于 2011-06-30T00:21:31.270 に答える
2

たぶん、この方法でクラスをリファクタリングしてみてください:

public class TableCellRendererCenter extends JLabel implements TableCellRenderer{

public TableCellRendererCenter(JTable associatedTable){

    this.table = associatedTable;
    JTableHeader header = this.table.getTableHeader();

    this.setHorizontalAlignment(SwingConstants.CENTER);
    this.setForeground(header.getForeground());
    this.setBackground(header.getBackground());
    this.setFont(header.getFont());

}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

    return this;

}}

編集:私は今チェックしました。DefaultTableCellRendererはすでに JComponent を拡張しています。したがって、次の行のみが必要になる可能性があります。

this.setForeground(header.getForeground());
this.setBackground(header.getBackground());
this.setFont(header.getFont());

(よくわかりません。似たようなことをしましたが、列ヘッダーではなく、DefaultTableCellRendererを拡張していません)

于 2011-06-29T23:39:18.827 に答える