在保持JTable默认渲染器的同时对齐JTable单元格中的文本? [英] Align text in a JTable cell while maintaining JTable default renderer?
问题描述
由于这段代码,我有一个JTable可以做出可爱的颜色变换:
I have a JTable that does lovely alternations in coloration thanks to this code:
table.setDefaultRenderer(Object.class, new BorderRenderer(new ColorRenderer(table
.getDefaultRenderer(Object.class), colorProvider)));
(这里colorProvider包含将每隔一行变为浅灰色的代码。)我有一列我希望将文本对齐到中心。如果我只是在中心水平对齐的那一列上设置一个DefaultCellRenderer,它会覆盖表的默认渲染器,我会丢失可爱的条纹。
(Here the "colorProvider" contains code that turns every other row light grey.) I have one column in which I would like to align text to center. If I simply set a DefaultCellRenderer on that column with center horizontal alignment, it overrides the table's default renderer and I lose my lovely stripes.
我可以保留条纹并仍然更改列的对齐?
Can I keep the stripes and still change the alignment of a column?
为了使事情更复杂,我在超类中有上面的代码。我的子类知道他们想要更改对齐的列。
To further complicate things, I have the above code in a super class. It is my sub classes that know what column(s) they would like to change the alignment on.
推荐答案
非常感谢afk和camickr让我最终决定写一个TableCellRendererWrapper:
Thanks both to afk and camickr who led me to my final decision to write a 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;
}
}
这不是完美的,但它可以完成工作我。要使用它我执行此操作:
It's not perfect, but it gets the job done for me. To use it I do this:
// 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);
这篇关于在保持JTable默认渲染器的同时对齐JTable单元格中的文本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!