次のコードを使用しています。
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
パラメーターをさらにテストすることでこれを制御できます)。