概要

JTableのセル幅に合わせて文字列を折り返します。

サンプルコード

TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(1).setCellRenderer(new TestRenderer());
tcm.getColumn(2).setCellRenderer(new TextAreaCellRenderer());
// ...
class TextAreaCellRenderer extends JTextArea implements TableCellRenderer {
  TextAreaCellRenderer() {
    super();
    setLineWrap(true);
  }

  @Override public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
    if (isSelected) {
      setForeground(table.getSelectionForeground());
      setBackground(table.getSelectionBackground());
    } else {
      setForeground(table.getForeground());
      setBackground(table.getBackground());
    }
    setText((value == null) ? "" : value.toString());
    return this;
  }
}
// ...
class TestRenderer extends MyJLabel implements TableCellRenderer {
  public TestRenderer() {
    super();
    setOpaque(true);
    setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
  }

  @Override public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
    if (isSelected) {
      setForeground(table.getSelectionForeground());
      setBackground(table.getSelectionBackground());
    } else {
      setForeground(table.getForeground());
      setBackground(table.getBackground());
    }
    // setHorizontalAlignment((value instanceof Number) ? RIGHT : LEFT);
    setFont(table.getFont());
    setText((value == null) ? "" : value.toString());
    return this;
  }
}

class MyJLabel extends JLabel {
  private GlyphVector gvtext;
  public MyJLabel() {
    super();
  }

  @Override protected void paintComponent(Graphics g) {
    // super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    // ...
    g2.drawGlyphVector(gvtext,
                       getInsets().left,
                       getFont().getSize()+getInsets().top);
  }
  // ...
}
View in GitHub: Java, Kotlin

解説

  • 0列目
    • デフォルトのJLabelを継承するDefaultTableCellRendererを使用し超過分は...で省略
  • 1列目
    • 文字列の折り返しで作成したJLabelを継承するレンダラーを使ってセル幅に合わせて折り返し
  • 2列目
    • JTextAreaを継承するTableCellRendererを作成しJTextArea#setLineWrap(boolean)メソッドを使用して折り返しを有効化

参考リンク

コメント