在保持JTable默认渲染器的同时对齐JTable单元格中的文本?

时间:2010-11-05 02:22:48

标签: java jtable renderer

由于这段代码,我有一个JTable可以在着色中做出可爱的变换:

table.setDefaultRenderer(Object.class, new BorderRenderer(new ColorRenderer(table
                .getDefaultRenderer(Object.class), colorProvider)));

(这里“colorProvider”包含将每隔一行变为浅灰色的代码。)我有一列我希望将文本对齐到中心。如果我只是在具有中心水平对齐的列上设置DefaultCellRenderer,它将覆盖表的默认渲染器,并且我会丢失可爱的条纹。

我可以保留条纹并仍然更改列的对齐方式吗?

为了使事情更复杂,我在超类中有上面的代码。我的子类知道他们希望改变对齐的列。

4 个答案:

答案 0 :(得分:2)

  

我可以保留条纹并仍然更改列的对齐方式吗?

更简单的方法是使用Table Row Rendering。然后,您可以自定义各个渲染器的对齐方式,而不会影响行颜色。

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(???).setCellRenderer( centerRenderer );

答案 1 :(得分:1)

如果您尝试在超类的代码中设置的默认renederer上设置对齐方式,则会影响每个单元格。您有一个选项是为BorderRendererColorRenderer创建一个新的子类(以最合适的为准),并在其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 );
   }
   }