Swing/MagneticFrame のバックアップの現在との差分(No.1)
TITLE:JDesktopPaneにJInternalFrameを吸着させる
JDesktopPaneにJInternalFrameを吸着させる
編集者:Terai Atsuhiro~
作成日:2007-01-01
更新日:2021-03-21 (日) 04:15:18
概要
JDesktopPane
とJInternalFrame
の距離が近くなった場合、これらを自動的に吸着させます。
Screenshot
Advertisement
概要
JDesktopPaneとJInternalFrameの距離が近くなった場合、これらを自動的に吸着させます。サンプルコード
#spanend
#spanadd
desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
#spanend
#spanadd
desktop.setDesktopManager(new MagneticDesktopManager());
#spanend
#spandel
#screenshot
#spanend
#spanadd
// ...
#spanend
#spanadd
class MagneticDesktopManager extends DefaultDesktopManager {
#spanend
@Override public void dragFrame(JComponent frame, int x, int y) {
Container c = SwingUtilities.getAncestorOfClass(JDesktopPane.class, frame);
if (c instanceof JDesktopPane) {
JDesktopPane desktop = (JDesktopPane) c;
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);
}
}
}
#spandel
**サンプルコード [#o8501b2d]
#spanend
private class MagneticListener extends MouseInputAdapter {
private final JInternalFrame frame;
private final Point loc = new Point();
private static final int d = 10;
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 e) {
JDesktopPane desktop = frame.getDesktopPane();
Point p = e.getPoint();
Point pp = SwingUtilities.convertPoint(frame, p.x-loc.x, p.y-loc.y, desktop);
int xx = desktop.getSize().width -frame.getSize().width -pp.x;
int yy = desktop.getSize().height-frame.getSize().height-pp.y;
if(Math.abs(pp.x)>=d && Math.abs(pp.y)>=d && Math.abs(xx)>=d && Math.abs(yy)>=d) return;
desktop.getDesktopManager().dragFrame(
frame,
(pp.x<xx)?((Math.abs(pp.x)<d)?0:pp.x):((Math.abs(xx)<d)?xx+pp.x:pp.x),
(pp.y<yy)?((Math.abs(pp.y)<d)?0:pp.y):((Math.abs(yy)<d)?yy+pp.y:pp.y));
}
}
private static int getX(int e, int w) {
return e < w ? isNear(e) ? 0 : e : isNear(w) ? w + e : e;
}
-&jnlp;
-&jar;
-&zip;
private static int getY(int n, int s) {
return n < s ? isNear(n) ? 0 : n : isNear(s) ? s + n : n;
}
#spandel
**解説 [#oa45d781]
#spanend
#spandel
上記のサンプルでは、JDesktopPaneとJInternalFrameの距離が10pt以下になった場合、DesktopManager#.dragFrame(JInternalFrame,int,int)メソッドを使ってJInternalFrameの位置を変更することで、吸着を行っています。
#spanend
private static boolean isNear(int c) {
return Math.abs(c) < 10;
}
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlinコメント
解説
DesktopManager#dragFrame(JInternalFrame,int,int)
メソッドをオーバーライドすることでJInternalFrame
の配置座標を調整しています。上記のサンプルでは、JDesktopPane
とJInternalFrame
の距離が10px
以下になった場合、それぞれの辺が吸着するよう設定しています。