2

由于这段代码,我有一个 JTable 可以在颜色上进行可爱的交替:

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

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

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

更复杂的是,我在一个超类中有上面的代码。是我的子类知道他们想要更改对齐的列。

4

4 回答 4

2

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

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

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(???).setCellRenderer( centerRenderer );
于 2010-11-05T03:41:29.170 回答
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);
于 2010-11-05T17:55:53.217 回答
1

如果您尝试在超类代码中设置的默认渲染器上设置对齐方式,您将影响每个单元格。BorderRenderer您可以选择为其中一个或ColorRenderer (以最合适的那个)创建一个新的子类,并在其getTableCellRendererComponent获取调用返回的值super.getTableCellRendererComponent并在返回之前设置对齐方式。然后,您可以为需要对齐的列设置该渲染器的实例。

于 2010-11-05T02:33:45.490 回答
1

使用这种方法,它会将标题和表格内容对齐到居中对齐。但是,您可以将 CENTER 更改为 LEFT 或 RIGHT 对齐方式。

    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 );
   }
   }
于 2013-02-24T19:16:04.657 回答