TITLE:JDesktopPaneにJInternalFrameを吸着させる

JDesktopPaneにJInternalFrameを吸着させる

編集者:Terai Atsuhiro
作成日:2007-01-01
更新日:2021-03-21 (日) 04:15:18

概要

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

#screenshot

サンプルコード

private class MagneticListener extends MouseInputAdapter {
  private final JInternalFrame frame;
  private final Point loc = new Point();
  public MagneticListener(JInternalFrame frame) {
    this.frame = frame;
  }
  public void mousePressed(MouseEvent e) {
    Point p1 = frame.getLocation();
    Point p2 = SwingUtilities.convertPoint(frame, e.getPoint(), frame.getDesktopPane());
    loc.setLocation(p2.x-p1.x, p2.y-p1.y);
  }
  public void mouseDragged(MouseEvent me) {
    JDesktopPane desktop = frame.getDesktopPane();
    Point ep = me.getPoint();
    Point pt = SwingUtilities.convertPoint(frame, ep.x-loc.x, ep.y-loc.y, desktop);
    int e = pt.x;
    int n = pt.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)) {
      int x = (e<w)?(isNear(e)?0:e):(isNear(w)?w+e:e);
      int y = (n<s)?(isNear(n)?0:n):(isNear(s)?s+n:n);
      desktop.getDesktopManager().dragFrame(frame,x,y);
    }
  }
  private boolean isNear(int c) {
    return (Math.abs(c)<10);
  }
}
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、JDesktopPaneとJInternalFrame(タイトルがMagneticFrameの方だけ)の距離が10pt以下になった場合、DesktopManager#.dragFrame(JInternalFrame,int,int)メソッドを使ってJInternalFrameの位置を変更することで、吸着を行っています。

  • 課題
    • アイコン化している時に吸着できない

コメント