Swing/DividerLocationDragLayer のバックアップ(No.7)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DividerLocationDragLayer へ行く。
- category: swing folder: DividerLocationDragLayer title: JSplitPaneに追加したコンポーネントをドラッグしてDividerの位置を変更する tags: [JSplitPane, Divider, JLayer] author: aterai pubdate: 2016-05-30T00:20:49+09:00 description: JSplitPaneに追加した子コンポーネントの余白などをドラッグしてDividerの位置を変更可能にするJLayerを設定します。 image:
概要
JSplitPane
に追加した子コンポーネントの余白などをドラッグしてDivider
の位置を変更可能にするJLayer
を設定します。
Screenshot
Advertisement
サンプルコード
class DividerLocationDragLayerUI extends LayerUI<JSplitPane> {
private int dividerLocation;
private final Point startPt = new Point();
@Override public void installUI(JComponent c) {
super.installUI(c);
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(
AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
}
}
@Override public void uninstallUI(JComponent c) {
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(0);
}
super.uninstallUI(c);
}
@Override protected void processMouseEvent(
MouseEvent e, JLayer<? extends JSplitPane> l) {
JSplitPane splitPane = l.getView();
Component c = e.getComponent();
if (splitPane.equals(SwingUtilities.getUnwrappedParent(c))
&& e.getID() == MouseEvent.MOUSE_PRESSED) {
startPt.setLocation(SwingUtilities.convertPoint(c, e.getPoint(), splitPane));
dividerLocation = splitPane.getDividerLocation();
}
}
@Override protected void processMouseMotionEvent(
MouseEvent e, JLayer<? extends JSplitPane> l) {
JSplitPane splitPane = l.getView();
Component c = e.getComponent();
if (splitPane.equals(SwingUtilities.getUnwrappedParent(c))
&& e.getID() == MouseEvent.MOUSE_DRAGGED) {
Point pt = SwingUtilities.convertPoint(c, e.getPoint(), splitPane);
int delta = splitPane.getOrientation() == JSplitPane.HORIZONTAL_SPLIT
? pt.x - startPt.x : pt.y - startPt.y;
splitPane.setDividerLocation(Math.max(0, dividerLocation + delta));
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JSplitPane
のDivider
をマウスでドラッグするだけでなくJSplitPane#setRightComponent(...)
などで追加した子コンポーネントをマウスでドラッグすることで分割位置を変更できるようにJSplitPane
にマウスイベントを取得するLayerUI
を設定しています。
- ドラッグ可能になるのは
JSplitPane
の子コンポーネントの余白(そのコンポーネントが別途マウスイベントを処理しない領域)- 例えばマウスリスナーを追加していない
JLabel
はドラッグ可能、JButton
などはドラッグ不可となる
- 例えばマウスリスナーを追加していない