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

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

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

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

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

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

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

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

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

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

非常感谢afk和camickr让我最终决定写一个TableCellRendererWrapper:

 public class ColumnAlignmentRenderer implements TableCellRenderer { private TableCellRenderer mWrappedRenderer; private int mDefaultAlignment = SwingConstants.LEFT; private Map mSpecialColumnAlignmentMap = new Hashtable(); 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); 

使用此方法,它将标题和表格内容对齐到居中对齐。 但是,您可以将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 ); } }