Jér*_*nge 2 java swing look-and-feel jtableheader
我使用以下代码:
public final class TableCellRendererCenter extends DefaultTableCellRenderer {
public static final TableCellRenderer INSTANCE
= new TableCellRendererCenter();
protected TableCellRendererCenter() {
// Calling super
super();
this.setHorizontalAlignment(SwingConstants.CENTER);
}
}
Run Code Online (Sandbox Code Playgroud)
在JTable列上:
TableColumnModel retrMod = ChartItemsTable.getColumnModel();
TableColumn retrCol = retrMod.getColumn(2);
retrCol.setHeaderRenderer(TableCellRendererCenter.INSTANCE);
retrCol.setCellRenderer(TableCellRendererCenter.INSTANCE);
Run Code Online (Sandbox Code Playgroud)
并且外观与其他列标题不再匹配:
为什么?我该如何解决这个问题?
编辑
似乎NetBeans正在使用DefaultTableCellHeaderRenderer
它来自package sun.swing.table;
我到处读到我不应该使用太阳包.Grrrr ......这没有用!
编辑2
0verbose的建议产生以下结果:
解
根据eugener的建议,我更新了我的代码如下:
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) {}
}
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
保留了外观并且列标题居中!(其他列标题也是居中的,但我可以通过对int row, int column
参数进行进一步测试来控制它).
问题是您使用的是不同的单元格渲染器,而不是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) {}
}
Run Code Online (Sandbox Code Playgroud)
显然,一旦你有适当的渲染器,你可以把它投射到JLabel(当然,在检查它之后),然后将文本居中或做其他事情.
归档时间: |
|
查看次数: |
2441 次 |
最近记录: |