2

简单的问题,但我似乎无法在网上的任何地方找到答案。

您如何使用自定义 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
    }
  }

我会假设更改渲染文本样式是相似的,但是如何将字体设置为与默认表格字体相同但以粗体显示?

4

5 回答 5

5

您可能还想考虑表格行渲染方法,它可以让您更灵活地控制您更改字体的单元格。我用它来加粗所选行的所有列中的文本。

于 2010-02-08T21:21:49.863 回答
5

如果您已经可以获得默认的表格字体(我想应该是c.getFont()),那么就使用deriveFont(Font.BOLD)它。

于 2010-02-08T21:11:41.130 回答
1

如here所述,使用缓存将字体设置为粗体将起作用。

如果您只需要将部分文本设置为粗体 - 使用 HTML。表格单元格渲染器基于JLabel(或者您可以返回一个)。将您的文本转换为 html 将允许几乎任何文本属性更改。

我们广泛使用这种技术,并没有看到任何显着的性能下降。

于 2010-02-08T22:41:37.703 回答
1

这是懒人的方法:使用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);
  }
}
于 2010-02-08T23:18:48.320 回答
0

你也可以用这个..

        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;

    }

}
于 2010-02-09T03:03:21.433 回答