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

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

編集者:Terai Atsuhiro
作成日:2004-07-12
更新日:2023-12-14 (木) 10:20:14

概要

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

#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);
   }
   ......
 }
  • &jnlp;
  • &jar;
  • &zip;

解説

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

参考リンク

コメント