Swing: TableCellRenderer, который использует полужирный шрифт для некоторых ячеек.

Простой вопрос, но я не могу найти ответ нигде в Интернете.

Как использовать пользовательский TableCellRenderer для отображения некоторых ячеек таблицы жирным шрифтом?

Я знаю, как использовать TableCellRenderer для установки цвета фона для каждой ячейки. Вы делаете что-то вроде:

  public class MyTableCellRenderer extends DefaultTableCellRenderer 
  {
    @Override public Component getTableCellRendererComponent(JTable table,
       Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value,
          isSelected, hasFocus, row, column);
        // modify the component "c" to have whatever attributes you like
        // for this particular cell
    }
  }

Я предполагаю, что изменение стиля текста рендеринга аналогично, но как установить шрифт таким же, как шрифт таблицы по умолчанию, но выделенный жирным шрифтом?


person Jason S    schedule 08.02.2010    source источник


Ответы (5)


Если вы уже можете получить табличный шрифт по умолчанию (который, как я полагаю, будет c.getFont()), просто используйте deriveFont(Font.BOLD).

person Michael Myers    schedule 08.02.2010
comment
есть ли значительные затраты при этом каждый раз, когда ячейка визуализируется? или я должен кэшировать полужирный шрифт? - person Jason S; 09.02.2010
comment
Если шрифт таблицы никогда не меняется, то обязательно кэшируйте его. Я не знаю, сколько стоит звонок. - person Michael Myers; 09.02.2010

Вы также можете рассмотреть подход к рендерингу строк таблицы что может дать вам немного больше гибкости в управлении тем, для каких ячеек вы меняете шрифт. Я использовал его для выделения текста жирным шрифтом во всех столбцах выбранной строки.

person camickr    schedule 08.02.2010
comment
хммм... я не понимаю разницы, ты хоть представляешь, чем это отличается? - person Jason S; 09.02.2010
comment
Этот подход не меняет способ получения полужирного шрифта. Он меняется только там, где вы используете метод setFont(...) для применения полужирного шрифта к средству визуализации. Это полезно, когда у вас есть таблица с несколькими столбцами с разными типами данных. Вместо того, чтобы создавать несколько рендереров с собственным кодом в каждом рендерере, чтобы сделать шрифт полужирным, вам нужно всего лишь переопределить один метод JTable. - person camickr; 09.02.2010

Установка полужирного шрифта с кэшированием, как уже описано здесь, будет работать.

Если вам нужно выделить только часть текста жирным шрифтом - используйте HTML. Визуализаторы ячеек таблицы основаны на JLabel (или вы можете вернуть его). Преобразование вашего текста в html позволит изменить практически любой текстовый атрибут.

Мы широко используем этот метод и не заметили значительного снижения производительности.

person Eugene Ryzhikov    schedule 08.02.2010

Вот подход ленивого человека: используйте DefaultTableCellRenderer (который является подклассом JLabel) и используйте HTML, чтобы указать, когда вы хотите использовать полужирный шрифт.

Это будет не так эффективно, как определение собственного пользовательского средства визуализации и непосредственное управление шрифтами, но код, как правило, более компактен, поэтому он подходит для простых приложений.

/**
 * Renderer implementation for rendering Strings.
 * Strings beginning with 'A' are rendered in bold.
 */
public class MyRenderer extends DefaultTableCellRenderer {
  public Component getTableCellRendererComponent(JTable table,
                                               Object value,
                                               boolean isSelected,
                                               boolean hasFocus,
                                               int row,
                                               int column) {

    String txt = String.valueOf(value);

    if (txt != null && txt.startsWith("A")) {
      // Reassign value as an HTML string.
      // Obviously need to consider replacing HTML special characters
      // if doing this properly.
      value = String.format("<body><b>%s</b></body>", txt);
    }

    // Delegate to superclass which will set the label text, background, etc.
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
  }
}
person Adamski    schedule 08.02.2010
comment
Использование возможностей синтаксического анализа HTML в JLabel мне очень много раз помогало. - person Laurent K; 09.02.2010

вы также можете использовать это..

        class SampleRenderer extends DefaultTableCellRenderer
        {

        public Component getJtableCellRendererComponent(Jtable table,Object value,boolean     isSelected , boolean hasFocus , int row, int column)

        {

        JLabel c = (JLabel)super.getJtableCellRendererComponent(table,value,isSelected ,hasFocus , row, column);

        Font f = c.getFont();

        c.setFont(f.getName(),Font.BOLD,f.getSize()));

        return c;

    }

}
person sreejith    schedule 09.02.2010