JSplitPaneに追加したコンポーネントをドラッグしてDividerの位置を変更する
Total: 3583
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
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
などはドラッグ不可となる
- 例えばマウスリスナーを追加していない