System.out.println("またJavaの季節がやってきた!" + 2);
■ このスレッドは過去ログ倉庫に格納されています
去年の今頃Java学習開始するも挫折
しかし不屈の闘志をめらめらと燃やしながら
そびえ立つ岩壁にいどむため、再びこの地にやってきたのだ!
プログラミング歴は独学Cチョビッツ+独学VBA少々
きょうかしょ
https://www.amazon.co.jp/dp/484433638X
スッキリわかるJava入門 第2版 (スッキリシリーズ) 次に行こう
ウィンドウのD&D移動である
これまで書いてきた処理のほとんどはイベント系の処理だ
D&D移動もイベント系の処理の一つである
パターンがつかめてくると、理解するまでのスピードが速くなってくる
D&D移動の処理も3つのイベントに区分できる
T マウスを押す
U そのままマウスを動かすことでウィンドウがうごく
V マウスを放す
それぞれの処理を引き受けるインターフェースは
T MouseListener
U MouseMotionListener
V MouseListener
ということになる
TとUは同じMouseListenerを使うため、コードはまとめることができるだろう ウィンドウD&D移動
public class Main extends JFrame {
static Point pt;
Main() {
setSize(100, 100);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addMouseListener(
new MouseListener() {
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {//@
pt = e.getPoint();
}
public void mouseReleased(MouseEvent e) {//B
pt = null;
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
);
addMouseMotionListener(
new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {//A
Point currentPt = e.getLocationOnScreen();
setLocation(currentPt.x - pt.x, currentPt.y - pt.y);//
}
public void mouseMoved(MouseEvent e) {}
}
);
}
public static void main(String[] args) {
Main ma = new Main();
ma.setVisible(true);
}
} 一気に匿名クラスを使った最終版を書いたわけだが
基本的にはこれまでとパターンは同じだ
細かい処理が違ってくるだけだ
まずここで使っているPointというクラスが大事だ
簡単にいえばデスクトップ上の(x, y)座標を格納してくれるインスタンスを生成できるクラスなのだ
正確にいうと、デスクトップ上の(x, y)座標は絶対座標というが、
Pointのインスタンスは相対座標も格納できる
今回使われる相対座標は、マウスをウィンドウ内でクリックしたとき、マウスの座標を
ウィンドウの左上端から測った相対座標である
Pointインスタンスに格納された座標をStringで表示するには
Point pt = new Point();
pt = e.getPoint();
を前提とするなら
System.out.prinln(pt.x);
System.out.println(pt.y);
System.out.println(pt);
のどれでもOKだ。一番下のものはtoStringの機能が自動で使われており便利だ
相対座標を取得するメソッドはgetPoint()
絶対座標を取得するメソッドはgetLocationOnScreen()
どちらもActionEvent e つまり「震動」の発生地点の座標を測ることになるので
e.getPoint()
e.getLocationOnScreen
のように e を基準としてコードを書くことになる
T〜Vの処理を細かく見ていく
T→@
マウスを押すことでウィンドウ左上端から測ったマウスの相対位置をptに格納
相対座標はAで使うためにここで取得している
U→A
ドラッグするごとに変化するマウスの位置をcurrentPtに格納していくと同時に
currentPtに応じてウィンドウの位置を設定していく
setLocationにはウィンドウの左上端となる座標を渡さないといけないので
currentPtから相対座標分だけずらした座標を計算してわたすことになる
マウスの座標をそのまま渡してはいけない点に注意しなければならない
V→B
ptにnullを入れる
ちなみにB処理だが、pt = null; をコメント行にしても正常に動いた
pt = null:が必須なのかはよくわからない
少なくとも、ptを他の処理に使い回したい場合にはこうして置いた方がよいのかなと思った ■ このスレッドは過去ログ倉庫に格納されています