• category: swing folder: ColumnWidthTooltip title: TableColumnのリサイズ中にその幅をJToolTipで表示する tags: [JTable, JTableHeader, TableColumn, JToolTip, JWindow] author: aterai pubdate: 2019-07-29T02:07:59+09:00 description: TableColumnをマウスでリサイズ中の場合、その幅をJWindowに配置したJToolTipで表示します。 image: https://drive.google.com/uc?id=10_c07xtUT3tMntB9hunUeA4fV-jZN50j

概要

TableColumnをマウスでリサイズ中の場合、その幅をJWindowに配置したJToolTipで表示します。

サンプルコード

class ColumnWidthResizeHandler extends MouseInputAdapter {
  private final JWindow window = new JWindow();
  private final JToolTip tip = new JToolTip();
  private String prev = "";

  private Point getToolTipLocation(MouseEvent e) {
    Point p = e.getPoint();
    Component c = e.getComponent();
    SwingUtilities.convertPointToScreen(p, c);
    p.translate(0, -tip.getPreferredSize().height);
    return p;
  }

  private static TableColumn getResizingColumn(MouseEvent e) {
    Component c = e.getComponent();
    if (c instanceof JTableHeader) {
      return ((JTableHeader) c).getResizingColumn();
    }
    return null;
  }

  private void updateTooltipText(MouseEvent e) {
    TableColumn column = getResizingColumn(e);
    if (column != null) {
      String txt = String.format("Width: %dpx", column.getWidth());
      tip.setTipText(txt);
      if (prev.length() != txt.length()) {
        window.pack();
      }
      window.setLocation(getToolTipLocation(e));
      prev = txt;
    }
  }

  @Override public void mouseDragged(MouseEvent e) {
    if (!window.isVisible() && getResizingColumn(e) != null) {
      window.add(tip);
      window.setAlwaysOnTop(true);
      window.setVisible(true);
    }
    updateTooltipText(e);
  }

  @Override public void mouseReleased(MouseEvent e) {
    window.setVisible(false);
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、TableColumnのマウスによるリサイズイベントを取得してその幅をJToolTipで表示しています。

  • JTable#getColumnModel()#addColumnModelListener(...)
    • TableColumnModelListenerでは列の追加、削除、移動イベントは取得可能だが、リサイズイベントは取得不可
  • JTable#getTableHeader()#addPropertyChangeListener(...)
    • JTableHeaderPropertyChangeListenerを追加し、JTableHeader#getResizingColumn()メソッドでリサイズ状態のColumnModelを取得可能だが、リサイズ終了イベントが取得できない
  • JTable#getTableHeader()#addMouseListener(...)JTable#getTableHeader()#addMouseMotionListener()
    • MouseListenerJTableHeader#getResizingColumn()メソッドを合わせて使用し、ColumnModelリサイズの開始終了を取得
    • MouseMotionListenerを使用し、リサイズ中はColumnModel#getWidth()メソッドで取得したColumnModelの幅をJToolTipで表示
    • JToolTipのデフォルトウィンドウは使用せず、別途用意したJWindowJToolTipを追加し、そのJWindowで表示・非表示や位置の更新を操作

参考リンク

コメント