2次元空間の点
座標の点
前回の内容などでもよくわかると思いますが
GUIプログラムでは、画像や文字などのコンポーネントを表示するために
コンポーネント上の位置を2次元のx座標とy座標で表します
最初のほうにやった図形でも、頻繁に位置を指定しましたね
そこで、このような2次元空間における2点の座標をカプセル化したクラスがあります
それがjava.awt.Pointクラスです
コンストラクタは次のとおりです
public Point()
public Point( Point p )
public Point( int x, int y )
一番上のなにも指定しない場合は、x,y座標共に0の点で初期化します
pはPointオブジェクトと同じ位置に点を作成します
xにはx座標、yにはy座標を指定します
このクラスには、座標を確保する二つの変数が存在します
public int x x座標
public int y y座標
なんらかの座標を動的に変更したり
2点をもとに、動的に変更する図形やアニメーションなどで、このクラスは非常に便利です
指定位置に座標を変更するには同クラスのsetLocation()メソッドを使用します
public void setLocation( Point p )
public void setLocation( int x, int y )
pの場合、Pointオブジェクトの座標に変更し
xとyは、数値で座標を指定します (同一の動作をするメソッドで public void move( int x, int y ) というのもあります)
また、現在の座標から相対的に移動する場合はtranslate()メソッドを使用します
public void translate( int dx, int dy )
dx , dy には、相対移動するx座標とy座標を指定します
これは ( x + dx , y + dy ) と同じ動作をします
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="App44.class" width="300"height="300">
</applet>
*/
public class App44 extends Applet implements MouseMotionListener {
Label lb;
Point p = new Point();
public void init() {
setBackground(Color.white);
lb = (Label)add(new Label("カーソルを乗せてください" , Label.CENTER));
addMouseMotionListener(this);
}
public void mouseMoved(MouseEvent e) {
p.setLocation(e.getX() , e.getY());
lb.setText("x = " + p.x + " : y = " + p.y);
}
public void mouseDragged(MouseEvent e) { }
}
マウスカーソルをコンポーネントじょうに乗せると、座標を表示するアプレットです
前回のような、複雑な座標計算を要求される場合などにPointクラスは有効です
このほかにも、現在の座標を持つオブジェクトを返すgetLocation()メソッドなどもあります
public Point getLocation()
現在のオブジェクトの座標のコピーを返します
点と幅
Pointクラスは、2次元空間の座標を意味する「点」でした
しかし、Java言語の図形システムは点と点ではなく(つまり、絶対座標同士ではなく)
一つの点と、その点を座標とした相対値から図を描きます
これは、GraphicsクラスのdrawRect()メソッドなどでよくわかります
ある点と、そこからの相対的な縦と横の幅を表現するにはPointクラスでは役不足です
そこで、長方形の座標をカプセル化するのがjava.awt.Rectangleクラスです
コンストラクタは次のものが用意されています
public Rectangle()
public Rectangle( Rectangle r )
public Rectangle( int x, int y, int width, int height )
public Rectangle( int width, int height )
public Rectangle( Point p, Dimension d )
public Rectangle( Point p )
public Rectangle( Dimension d )
pは座標の原点、dは座標からの幅を指定します
x , y はx座標とy座標、widthとheightは横幅と縦幅です
座標を指定しない場合は、x,y共に0を座標とします
幅を指定しなければ、座標から0の長方形になります
このクラスは、2点の座標と幅の変数を持ちます
現在のオブジェクトのサイズを得るには、この変数を参照します
public int height | 高さ
|
public int width | 幅
|
public int x | x座標
|
public int y | y座標
|
現在の座標を変更するにはsetLocation()メソッドを
現在の幅を変更するにはsetSize()メソッドを使用します
また、現在の座標を得るgetLocation()と
現在の幅を得るgetSize()メソッドも用意されています
public void setLocation( Point p )
public void setLocation( int x, int y )
public void setSize( Dimension d )
public void setSize( int width, int height )
public Point getLocation()
public Dimension getSize()
setLocation()のpは、新しく設定する座標オブジェクトを指定します
xとyは、数値でx座標とy座標を指定します
setSize()のdには、新しく設定する幅のオブジェクトを指定します
widthとheightは、同様に数値で幅を変更します
getLocation()は、現在の座標を表すPointオブジェクトを
getSize()は、現在の幅を表すDemensionオブジェクトを返します
このように、座標はPoint、幅はDimensionオブジェクトで表すことができるので
その関係になれることが重要です
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="App45.class" width="300"height="300">
</applet>
*/
public class App45 extends Applet implements MouseMotionListener {
Rectangle rec = new Rectangle();
public void init() {
setBackground(Color.white);
addMouseMotionListener(this);
}
public void mouseMoved(MouseEvent e) {
rec.setLocation(e.getX() , e.getY());
}
public void mouseDragged(MouseEvent e) {
rec.setSize(e.getX() - rec.x , e.getY() - rec.y);
repaint();
}
public void paint(Graphics g) {
g.drawRect(rec.x , rec.y , rec.width , rec.height);
}
}
ドラッグすると長方形が描かれます
もっとも、マウスカーソル位置を座標原点にしているので(常に)
再描画すると、長方形の位置が変なところに変更されてしまいます