• category: swing folder: TwoRowsCellRenderer title: JTableのセル内に二行だけ表示 tags: [JTable, TableCellRenderer, JLabel, JPanel] author: aterai pubdate: 2010-12-20T15:44:39+09:00 description: JTableのセル内に文字列を二行分だけ表示し、あふれる場合は...で省略します。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQ77KlEsZJI/AAAAAAAAAuE/mc9fcp-ZmBU/s800/TwoRowsCellRenderer.png

概要

概要

JTableのセル内に文字列を二行分だけ表示し、あふれる場合は...で省略します。

サンプルコード

サンプルコード

JTable table = new JTable(model);
table.setAutoCreateRowSorter(true);
table.setRowHeight(table.getRowHeight() * 2);
table.setDefaultRenderer(String.class, new TwoRowsCellRenderer());
#spanadd
// ...
#spanend

#spandel
//...
#spanend
#spandel

#spanend
class TwoRowsCellRenderer extends JPanel implements TableCellRenderer {
  private final JLabel top = new JLabel();
  private final JLabel bottom = new JLabel();
#spanadd

#spanend
  public TwoRowsCellRenderer() {
    super(new GridLayout(2, 1, 0, 0));
    add(top);
    add(bottom);
  }
#spanadd

#spanend
  @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());
    }
    setFont(table.getFont());
    FontMetrics fm  = table.getFontMetrics(table.getFont());
    String text     = Objects.toString(value, "");
    String first    = text;
    String second   = "";
    int columnWidth = table.getColumnModel().getColumn(column).getWidth();
    int textWidth   = 0;
    String text = Objects.toString(value, "");
    String first = text;
    String second  = "";
    // int columnWidth = table.getColumnModel().getColumn(column).getWidth();
    int columnWidth = table.getCellRect(0, column, false).width;
    int textWidth = 0;
    for (int i = 0; i < text.length(); i++) {
      textWidth += fm.charWidth(text.charAt(i));
      if (textWidth > columnWidth) {
        first  = text.substring(0, i - 1);
        first = text.substring(0, i - 1);
        second = text.substring(i - 1);
        break;
      }
    }
    top.setText(first);
    bottom.setText(second);
    return this;
  }
}
View in GitHub: Java, Kotlin

解説

JLabelを上下に配置したJPanelを使って、TableCellRendererを作成しています。...での省略は、二行目のJLabelのデフォルト動作です。

解説

JLabelを上下に配置したJPanelを使って、TableCellRendererを作成しています。...での省略は、セル内2行目で使用しているJLabelのデフォルト動作です。

参考リンク

  • 補助文字(サロゲートペアなど)を含む文字列を扱う場合は、String#charAt(int)ではなくString#codePointAt(int)Character.charCount(codePoint)などを使用する必要がある
    • Java による Unicode サロゲートプログラミング
      #spanend
      #spanadd
      int i = 0;
      #spanend
      #spanadd
      while (i < text.length()) {
      #spanend
        int cp = text.codePointAt(i);
        textWidth += fm.charWidth(cp);
        if (textWidth > columnWidth) {
          first  = text.substring(0, i);
          second = text.substring(i);
          break;
        }
        i += Character.charCount(cp);
      #spanadd
      }
      #spanend
      #spanadd
      

参考リンク

コメント

コメント