在保持JTable默认渲染器的同时对齐JTable单元格中的文本? [英] Align text in a JTable cell while maintaining JTable default renderer?

查看:190
本文介绍了在保持JTable默认渲染器的同时对齐JTable单元格中的文本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于这段代码,我有一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆