Выровнять текст в ячейке JTable, поддерживая рендерер JTable по умолчанию? - PullRequest
2 голосов
/ 05 ноября 2010

У меня есть JTable, который прекрасно меняет окраску благодаря этому коду:

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

(Здесь «colorProvider» содержит код, который превращает все остальные строки в светло-серый.) У меня есть один столбец, в которомЯ хотел бы выровнять текст по центру.Если я просто установлю DefaultCellRenderer для этого столбца с горизонтальным выравниванием по центру, он переопределит средство визуализации таблицы по умолчанию, и я потеряю свои прекрасные полосы.

Можно ли сохранить полосы и при этом изменить выравнивание столбца?

Чтобы еще больше усложнить ситуацию, у меня есть вышеприведенный код в суперклассе.Мои подклассы знают, на какие столбцы они хотели бы изменить выравнивание.

Ответы [ 4 ]

2 голосов
/ 05 ноября 2010

Можно ли сохранить полосы и изменить выравнивание столбца?

Более простой подход - использовать Отображение строк таблицы .Затем вы можете настроить выравнивание отдельных средств визуализации, не затрагивая цвета строк.

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(???).setCellRenderer( centerRenderer );
1 голос
/ 24 февраля 2013

используйте этот метод, он будет выравнивать содержимое заголовка и таблицы по центру.Однако вы можете изменить ЦЕНТРАЛЬНОЕ на левое или правое выравнивание.

    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 );
   }
   }
1 голос
/ 05 ноября 2010

Спасибо и 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 голос
/ 05 ноября 2010

Если вы попытаетесь установить выравнивание по умолчанию для средства визуализации, установленного в коде вашего суперкласса, вы затронете каждую ячейку. У вас есть возможность создать новый подкласс для BorderRenderer или ColorRenderer (в зависимости от того, что наиболее подходит), и в его getTableCellRendererComponent получить значение, возвращаемое при вызове super.getTableCellRendererComponent, и установить выравнивание по нему перед возвратом. Затем вы можете установить экземпляр этого средства визуализации для столбца, который необходимо выровнять.

...