TITLE:JTableのセル幅で文字列を折り返し

Posted by terai at 2004-07-12

JTableのセル幅で文字列を折り返し

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

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

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);
  }
  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));
  }
  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();}
  protected void paintComponent(Graphics g) {
    //super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    //......
    g2.drawGlyphVector(gvtext,
                       getInsets().left,
                       getFont().getSize()+getInsets().top);
  }
  //......
}

解説

  • 1列目
    • 文字列の折り返しで作成したJLabelを継承するレンダラーを使って、セル幅に合わせて折り返しています。
  • 2列目
    • JTextAreaを継承するTableCellRendererを作成し、このレンダラーをJTextArea#setLineWrap(boolean)メソッドを使って折り返しを有効にしています。

参考リンク

コメント

  • メモ: TextAreaCellRendererを、NimbusLookAndFeel で使ったとき、うまく余白を消す方法が分からない。 -- terai
  • ここの方法だと行の高さも自動変更してくれます。ttp://www.roseindia.net/javatutorials/JTable_in_JDK.shtml -- とおりすがり