Swing/ColumnWidthTooltip のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ColumnWidthTooltip へ行く。
- 1 (2019-07-29 (月) 02:08:46)
- 2 (2019-07-29 (月) 20:25:17)
- 3 (2019-11-11 (月) 16:16:16)
- 4 (2021-05-28 (金) 08:07:58)
- 5 (2023-09-29 (金) 10:54:17)
- 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
で表示します。
Screenshot
Advertisement
サンプルコード
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(...)
JTableHeader
にPropertyChangeListener
を追加し、JTableHeader#getResizingColumn()
メソッドでリサイズ状態のColumnModel
を取得可能だが、リサイズ終了イベントが取得できない
JTable#getTableHeader()#addMouseListener(...)
、JTable#getTableHeader()#addMouseMotionListener()
MouseListener
とJTableHeader#getResizingColumn()
メソッドを合わせて使用し、ColumnModel
リサイズの開始終了を取得MouseMotionListener
を使用し、リサイズ中はColumnModel#getWidth()
メソッドで取得したColumnModel
の幅をJToolTip
で表示JToolTip
のデフォルトウィンドウは使用せず、別途用意したJWindow
にJToolTip
を追加し、そのJWindow
で表示・非表示や位置の更新を操作