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
    }
  }

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

5 ответов

Решение

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

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

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

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

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

Вот подход ленивца: Использование 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);
  }
}

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

        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;

    }

}
Другие вопросы по тегам