由于这段代码,我有一个JTable可以在着色中做出可爱的变换:
table.setDefaultRenderer(Object.class, new BorderRenderer(new ColorRenderer(table
.getDefaultRenderer(Object.class), colorProvider)));
(这里“colorProvider”包含将每隔一行变为浅灰色的代码。)我有一列我希望将文本对齐到中心。如果我只是在具有中心水平对齐的列上设置DefaultCellRenderer,它将覆盖表的默认渲染器,并且我会丢失可爱的条纹。
我可以保留条纹并仍然更改列的对齐方式吗?
为了使事情更复杂,我在超类中有上面的代码。我的子类知道他们希望改变对齐的列。
答案 0 :(得分:2)
我可以保留条纹并仍然更改列的对齐方式吗?
更简单的方法是使用Table Row Rendering。然后,您可以自定义各个渲染器的对齐方式,而不会影响行颜色。
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(???).setCellRenderer( centerRenderer );
答案 1 :(得分:1)
如果您尝试在超类的代码中设置的默认renederer上设置对齐方式,则会影响每个单元格。您有一个选项是为BorderRenderer
或ColorRenderer
创建一个新的子类(以最合适的为准),并在其getTableCellRendererComponent
中获取从调用super.getTableCellRendererComponent
返回的值,在返回之前设置对齐。然后,您可以为需要对齐的列设置该渲染器的实例。
答案 2 :(得分:1)
非常感谢afk和camickr让我最终决定写一个TableCellRendererWrapper:
public class ColumnAlignmentRenderer implements TableCellRenderer {
private TableCellRenderer mWrappedRenderer;
private int mDefaultAlignment = SwingConstants.LEFT;
private Map<Integer, Integer> mSpecialColumnAlignmentMap = new Hashtable<Integer, Integer>();
public ColumnAlignmentRenderer(TableCellRenderer pWrappedRenderer) {
mWrappedRenderer = pWrappedRenderer;
}
public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected,
boolean pHasFocus, int pRow, int pColumn) {
// Use the wrapped renderer
Component renderedComponent = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus,
pRow, pColumn);
// Set the alignment
Integer alignment = mSpecialColumnAlignmentMap.get(pColumn);
if (alignment != null) {
((JLabel)renderedComponent).setHorizontalAlignment(alignment);
} else {
((JLabel)renderedComponent).setHorizontalAlignment(mDefaultAlignment);
}
return renderedComponent;
}
public void setSpecialColumnAlignment(Integer pColumn, Integer pAlignment) {
mSpecialColumnAlignmentMap.put(pColumn, pAlignment);
}
public void setDefaultAlignment(int pAlignment) {
mDefaultAlignment = pAlignment;
}
}
这并不完美,但它可以帮我完成工作。要使用它,我这样做:
// Center alignment for "selected" column
ColumnAlignmentRenderer cellRenderer = new ColumnAlignmentRenderer(getTable().getDefaultRenderer(Object.class));
cellRenderer.setSpecialColumnAlignment(MyTableModel.COL_TO_CENTER, SwingConstants.CENTER);
getTable().setDefaultRenderer(Object.class, cellRenderer);
// Center alignmet for "selected" column header
ColumnAlignmentRenderer headerRenderer = new ColumnAlignmentRenderer(getTable().getTableHeader().getDefaultRenderer());
headerRenderer.setSpecialColumnAlignment(MyTableModel.COL_TO_CENTER, SwingConstants.CENTER);
getTable().getTableHeader().setDefaultRenderer(headerRenderer);
答案 3 :(得分:1)
使用此方法,它会将标题和表格内容对齐到居中对齐。但是,您可以将CENTER更改为左或右对齐。
public void setTableAlignment(JTable table){
// table header alignment
JTableHeader header = table.getTableHeader();
DefaultTableCellRenderer renderer = (DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer();
header.setDefaultRenderer(renderer);
renderer.setHorizontalAlignment(JLabel.CENTER);
// table content alignment
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
int rowNumber = table.getColumnCount();
for(int i = 0; i < rowNumber; i++){
table.getColumnModel().getColumn(i).setCellRenderer( centerRenderer );
}
}