由于这段代码,我有一个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单元格中的文本?
发布评论