TITLE:JWindowをマウスで移動
JWindowをマウスで移動
編集者:Terai Atsuhiro~
作成日:2004-09-06
更新日:2024-02-03 (土) 14:10:31
-
category: swing
folder: DragWindow
title: JWindowをマウスで移動
tags: [JWindow, JFrame, MouseListener, MouseMotionListener]
author: aterai
pubdate: 2004-09-06T00:58:19+09:00
description: JWindowなどのタイトルバーのないフレームをマウスで移動します。
image:
-
概要
JWindow
などのタイトルバーのないフレームをマウスで移動します。
Screenshot
概要
JWindowなどのタイトルバーのないフレームをマウスで移動します。
#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
public void createSplashScreen(String path) {
ImageIcon img = new ImageIcon(getClass().getResource(path));
DragWindowListener dwl = new DragWindowListener();
splashLabel = new JLabel(img);
splashLabel.addMouseListener(new MyMouseListener());
splashLabel.addMouseMotionListener(new MyMouseMotionListener());
splashLabel.addMouseListener(dwl);
splashLabel.addMouseMotionListener(dwl);
splashScreen = new JWindow(getFrame());
splashScreen.getContentPane().add(splashLabel);
splashScreen.pack();
splashScreen.setLocationRelativeTo(null);
}
#spandel
private MouseEvent start;
#spanend
#spandel
class MyMouseListener extends MouseAdapter {
#spanend
public void mousePressed(MouseEvent me) {
start = me;
#spanadd
#spanend
#spanadd
class DragWindowListener extends MouseAdapter {
#spanend
private final Point startPt = new Point();
private Window window;
#spanadd
#spanend
@Override public void mousePressed(MouseEvent me) {
startPt.setLocation(me.getPoint());
}
#spandel
}
#spanend
#spandel
class MyMouseMotionListener extends MouseMotionAdapter {
#spanend
private Point loc;
private Window frame;
public void mouseDragged(MouseEvent me) {
if(frame==null) {
Component cmp = (Component)me.getSource();
frame = SwingUtilities.windowForComponent(cmp);
#spanadd
#spanend
@Override public void mouseDragged(MouseEvent me) {
if (window == null) {
window = SwingUtilities.windowForComponent(me.getComponent());
}
loc = frame.getLocation(loc);
int x = loc.x - start.getX() + me.getX();
int y = loc.y - start.getY() + me.getY();
frame.setLocation(x, y);
Point eventLocationOnScreen = me.getLocationOnScreen();
window.setLocation(eventLocationOnScreen.x - startPt.x,
eventLocationOnScreen.y - startPt.y);
// loc = window.getLocation(loc);
// int x = loc.x - start.getX() + me.getX();
// int y = loc.y - start.getY() + me.getY();
// window.setLocation(x, y);
}
}
解説
JWindowや、setUndecorated(true)したJFrameのようにタイトルバーのないフレームをマウスのドラッグで移動します。実際はJWindowに、MouseMotionListenerなどを実装したコンポーネントを追加しています。
解説
JWindow
やsetUndecorated(true)
したJFrame
のようにタイトルバーのないフレームをマウスのドラッグで移動します。実際はJWindow
自体にリスナーを設定するのではなく子コンポーネントにMouseMotionListener
などを追加しています。
上記のサンプルでは、Splash ScreenのJLabelにリスナーを追加し、これをJWindowに貼り付けてドラッグできるようにしています。
上記のサンプルではJLabel
にリスナーを追加し、これをJWindow
に配置してドラッグ可能にしています。
次に開くsetUndecorated(true)したJFrameでは、青いラベル部分をドラッグすることが出来ます。
- スプラッシュスクリーンの次に開く
JFrame
はJFrame#setUndecorated(true)
を設定してタイトルバーなどは非表示
- 代わりに青いラベル部分をドラッグ可能に設定
コメント
- マルチディスプレイなどで別画面に移動できないバグ?を修正
- ただし
Web Start
のSandBox
内では以前と同じく画面の外までは移動不可?
-
JNLP
のセキュリティにall-permissions
を設定する必要がある
-
Swing Tutorial
の FrameDemo2で試しても、同様?
-
Look and feel decorated
: 画面外に移動不可
-
Window system decorated
: 画面外に移動可能
参考リンク