JSplitPaneやTableColumnのリサイズカーソルを変更する
Total: 1284
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JSplitPane
のDivider
やJTableHeader
のTableColumn
でコンボーネントをリサイズ中に表示されるマウスカーソルを変更します。
Screenshot
Advertisement
サンプルコード
JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
BasicSplitPaneDivider divider = ((BasicSplitPaneUI) sp2.getUI()).getDivider();
divider.setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
JSplitPane sp3 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT) {
@Override public void updateUI() {
super.updateUI();
EventQueue.invokeLater(() -> {
BasicSplitPaneDivider d = ((BasicSplitPaneUI) getUI()).getDivider();
d.setCursor(ResizeCursorUtils.createCursor("⇹", 32, 32, d));
});
}
};
View in GitHub: Java, Kotlin解説
- 上:
JSplitPane
- デフォルトは左右分割の場合
Cursor.E_RESIZE_CURSOR
、上下分割の場合Cursor.S_RESIZE_CURSOR
を使用するようBasicSplitPaneDivider
でハードコーディングされている Ubuntu
環境のCursor.E_RESIZE_CURSOR
はホットスポットがカーソルの中央ではなく左端に存在するため、左右分割のDivider
上にカーソルを置くと左コンポーネント上にカーソルがジャンプ?してしまう
- デフォルトは左右分割の場合
- 中:
JSplitPane
- 左右分割
Divider
のカーソルをUbuntu
環境ではホットスポットが右端に存在するCursor.W_RESIZE_CURSOR
に変更- Splitter.java - IntelliJ IDEA Community Editionのリサイズカーソルも左右分割なら
Cursor.E_RESIZE_CURSOR
、上下分割ならCursor.N_RESIZE_CURSOR
を使用している
- Splitter.java - IntelliJ IDEA Community Editionのリサイズカーソルも左右分割なら
Windows
環境ではCursor.E_RESIZE_CURSOR
、Cursor.W_RESIZE_CURSOR
ともにホットスポットはカーソル中央なので変化なし- このサンプルでは上下分割に切り替えた場合などには未対応
- 左右分割
- 下:
JSplitPane
- ホットスポットを文字
⇹
の中央に設定したカスタムカーソルを作成してリサイズカーソルとしてDivider
に設定 - Cursorオブジェクトの生成
- このサンプルでは上下分割に切り替えた場合などには未対応
- ホットスポットを文字
- 上中:
TableColumn
JSplitPane
と同様にデフォルトは左右分割の場合Cursor.E_RESIZE_CURSOR
、上下分割の場合Cursor.S_RESIZE_CURSOR
を使用するようBasicTableHeaderUI
でハードコーディングされている- リサイズカーソル(
Cursor.E_RESIZE_CURSOR
)表示中にキー入力でLookAndFeel
を切り替えるとJTableHeader
上では常にCursor.E_RESIZE_CURSOR
が表示されてCursor.DEFAULT_CURSOR
に戻せなくなる
- 下:
TableColumn
- ホットスポットを
Excel
風に文字⇼
の中央に設定したカスタムカーソルを作成 BasicTableHeaderUI.MouseInputHandler#mouseMoved(...)
メソッドをオーバーライドしてJTableHeader
で使用
- ホットスポットを
class MyBasicTableHeaderUI extends BasicTableHeaderUI {
@Override protected MouseInputListener createMouseInputListener() {
return new MouseInputHandler() {
private final Cursor resizeCursor = ResizeCursorUtils.createCursor("⇼", 32, 32, header);
private final Cursor defaultCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
@Override public void mouseMoved(MouseEvent e) {
super.mouseMoved(e);
if (!header.isEnabled()) {
return;
}
if (ResizeCursorUtils.canResize(ResizeCursorUtils.getResizeColumn(header, e.getPoint()), header)) {
header.setCursor(resizeCursor);
} else {
header.setCursor(defaultCursor);
}
}
};
}
}