2010-11-05 36 views
2

我有一个JTable,做可爱的交替中着色得益于此代码:(这里的“colorProvider”包含的代码,轮流每隔一行浅灰色)在保持JTable默认渲染器的同时在JTable单元格中对齐文本?

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

我有一列中,我想将文本与中心对齐。如果我简单地在该列上设置一个中心水平对齐的DefaultCellRenderer,它将覆盖表的默认渲染器,并且我失去了我可爱的条纹。

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

为了进一步复杂化,我将上面的代码放在超类中。这是我的子类知道他们想要改变对齐的列。

回答

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); 
1

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

2

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

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

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); 
centerRenderer.setHorizontalAlignment(JLabel.CENTER); 
table.getColumnModel().getColumn(???).setCellRenderer(centerRenderer); 
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); 
    } 
    }