• category: swing folder: MagneticFrame title: JDesktopPaneにJInternalFrameを吸着させる tags: [DesktopManager, JDesktopPane, JInternalFrame] author: aterai pubdate: 2007-01-01T08:38:12+09:00 description: JDesktopPaneとJInternalFrameの距離が近くなった場合、これらを自動的に吸着させます。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTPnXoiDZI/AAAAAAAAAeQ/9SMGwoIqOi8/s800/MagneticFrame.png

概要

JDesktopPaneJInternalFrameの距離が近くなった場合、これらを自動的に吸着させます。

サンプルコード

desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
desktop.setDesktopManager(new DefaultDesktopManager() {
  @Override public void dragFrame(JComponent frame, int x, int y) {
    int e = x;
    int n = y;
    int w = desktop.getSize().width - frame.getSize().width - e;
    int s = desktop.getSize().height - frame.getSize().height - n;
    if (isNear(e) || isNear(n) || isNear(w) || isNear(s)) {
      super.dragFrame(frame, getX(e, w), getY(n, s));
    } else {
      super.dragFrame(frame, x, y);
    }
  }
  private static int getX(int e, int w) {
    return e < w ? isNear(e) ? 0 : e : isNear(w) ? w + e : e;
  }
  private static int getY(int n, int s) {
    return n < s ? isNear(n) ? 0 : n : isNear(s) ? s + n : n;
  }
  private static boolean isNear(int c) {
    return Math.abs(c) < 10;
  }
});
View in GitHub: Java, Kotlin

解説

DesktopManager#dragFrame(JInternalFrame,int,int)メソッドをオーバーライドすることでJInternalFrameの位置を調整しています。上記のサンプルでは、JDesktopPaneJInternalFrameの距離が10px以下になった場合、それぞれ吸着するよう設定しています。

コメント