---
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
---
* Summary [#summary]
`TableColumn`をマウスでリサイズ中の場合、その幅を`JWindow`に配置した`JToolTip`で表示します。
#download(https://drive.google.com/uc?id=10_c07xtUT3tMntB9hunUeA4fV-jZN50j)
* Source Code Examples [#sourcecode]
#code(link){{
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);
}
}
}}
* Description [#explanation]
* Description [#description]
上記のサンプルでは、`TableColumn`のマウスによるリサイズイベントを取得してその列幅を`JToolTip`で表示しています。
- `JTable#getColumnModel()#addColumnModelListener(...)`
-- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/event/TableColumnModelListener.html TableColumnModelListener]では列の追加、削除、移動イベントは取得可能だが列幅のリサイズイベントは取得不可
- `JTable#getTableHeader()#addPropertyChangeListener(...)`
-- `JTableHeader`に`PropertyChangeListener`を追加し、`JTableHeader#getResizingColumn()`メソッドでリサイズ状態の`ColumnModel`を取得可能だがリサイズ終了イベントが取得できない
- `JTable#getTableHeader()#addMouseListener(...)`、`JTable#getTableHeader()#addMouseMotionListener()`
-- `MouseListener`と`JTableHeader#getResizingColumn()`メソッドを合わせて使用し、`ColumnModel`リサイズの開始終了を取得
-- `MouseMotionListener`を使用して列幅のリサイズ中は`ColumnModel#getWidth()`メソッドで取得した`ColumnModel`の幅を`JToolTip`で表示
-- `JToolTip`のデフォルトウィンドウは使用せず別途用意した`JWindow`に`JToolTip`を追加し、その`JWindow`で表示・非表示や位置の更新を操作
* Reference [#reference]
- [[JToolTipの表示位置>Swing/ToolTipLocation]]
* Comment [#comment]
#comment
#comment