Java Drawing DrawTop

Language

JP  US  UK

 

図形の選択

 H. Jyounishi, Tokyo Japan
 

Frame (Index), No frame                 version:0.3(latest)  

要旨:図形の境界または内部をクリックし図形を選択する。 またマウスをドラッグしドラッグ領域に含まれる全ての図形を選択することもできる。 その他、すでに選択済の図形を再度クリックすると選択解除する、といった規則は他のドローツールと同様である。
このページで説明するクラス:: SelectionLS (LS: Listener) , SelectionListener , SelectionEvent , UnselectableAreas

1.概要
1.1 操作方法

図形選択操作は次の2通り。
 ①図形をクリックする。
 ②マウスで画面ドラッグしドラッグ領域に含まれる図形を全て選択する。


(1)図形選択の一般規則
∙ 既に選択図形を再度クリックした場合、その図形は選択解除になる。
∙ キャンバス上の図形のない点をクリックした場合、選択されている図形は選択解除される。

(2)クリックで選択する場合の規則
∙ Shift key/CTRL keyを押しながら図形をクリックした場合、既に選択されている図形に加えてその図形を選択できる。
∙ TextBox内部をクリックした場合、そのTextBoxをテキストの入力∙ 編集可能な状態にする。
 (注)TextBoxがグループ化されている場合でも、上記操作はできる。

1.2 選択図形の表示
(1) 基本図形、閉じた図形(境界曲線が閉)
∙ 図形を囲む領域に灰色の選択ボックスを付けて表示する。このボックス上でマウスボタンを押してドラッグすると図形が移動する。
∙ 選択ボックス上の四角マークと丸マークはリサイズハンドル。これをマウスで動かすことにより図形のサイズを変えられる。
 四角マークは上下、左右へのリサイズ、丸マークは斜め方向へのリサイズである。



Ellipse


Polyline



Text box

図1. 選択ボックス


(2)開いた図形(境界線が閉じていない)
∙ 小さな矩形マークは選択図形の端点を表す。

この矩形マークはリサイズハンドルの一種で、図形の端点をマウスでドラッグするために使われる。

∙ 選択された図形が直線、閉でない折れ線、三次曲線の場合、リサイズハンドルに加えて選択ボックスが表示される。



Lines

Polyline

Cubic curve

図2. 端点でのリサイズハンドルと選択ボックス


1.3 SelectionLSとMousePositionLSのマウスリスナーメソッドが呼び出される順序

• マウスクリックの場合

MousePositionLS.mousePressed -> SelectionLS.mousePressed -> MousePositionLS mouseReleased -> SelectionLS.mouseReleased
-> MousePositionLS mouseClicked -> SelectionLS.mouseClicked

• マウスクドラッグの場合

MousePositionLS.mousePressed -> SelectionLS.mousePressed -> MousePositionLS mouseDragged -> SelectionLS.mouseDragged ->....................
-> MousePositionLS mouseDragged -> SelectionLS.mouseDragged -> MousePositionLS mouseReleased -> SelectionLS.mouseReleased



2. SelectionLSクラス   戻る=>page top
∙ java.awt.event.MouseListener, MouseMotionListenerインターフェイスをインプリメントしたSelectionLS(LSはListenerの略)で図形の選択処理を行う。
∙ SelectionLSをサポートするクラスはMousePositionLSで、これからデータを受け取って選択処理を行う。

MousePositionLSはマウスを動かすたびに、マウスが図形のどこに位置しているかをリアルタイムで計算する。
例えば、選択ボックス上、リサイズハンドル上、閉図形の境界/内部、TextBox境界/内部に位置しているなど。


2.1 特記事項
特記事項 説明
SelectionLSの有効化、無効化 SelectionLSはこのアプリケーションに常駐するクラスであるが、次のようなケースでは動作すると困るので一時的に停止(無効化)する。
図形作成の場合に画面をマウスでクリックまたはドラッグする。 この操作で図形が選択されては困るのでSelectionLSを停止する。
TextBox内部をクリックしてテキストカーソルを表示する時、 またはTextBox内部をドラッグしてテキスト選択を行う場合はSelectionLSを停止。

①はSelectionLSのstart, endメソッドを呼んでSelectionLSの有効化、無効化を行う。
②はテキスト入力∙ 編集が可能なTextBox内部を選択禁止領域にする。 マウスの位置(X,Y)が選択禁止領域内か否かはinEditableTextAreaメソッドで判定する。
SelectionLSからコマンドを発行 図形の選択ボックス、リサイズハンドル上をマウスボタンを押すと、図形の移動またはリサイズを行うと見なし、コマンドを発行する。 この処理はprepareMoveResizeCommandメソッドで行う。


2.2 API     戻る=>page top
public class SelectionLS implements MouseListener, MouseMotionListener
フィールド 説明
listenerList
protected EventListenerList listenerList = new EventListenerList();
SelectionListenerを格納するリスト。
popupTrigger
(static)
public static boolean popupTrigger
∙ ポップアップメニューを起動するか否かのフラグ。
=> PopupTriggerの取得
∙ isPopupTrigger()=trueを検出したらすぐにポップアップメニューを起動するわけではない。

isPopupTrigger()=trueを検出した場合、少なくとも図形の選択処理を行なった後に起動する。
マウスクリックした場合mousePressed -> mouseReleased -> mouseClickedの順に呼び出されるので、 mouseClickedの最後に、ポップアップメニューを起動するか否かの決定を行う。
=> ポップアップメニューの起動

clicked boolean clicked
このクラスのmouseEventCompletedメソッドで参照される。 一回のマウスクリックに対し、mousePressed -> mouseReleased -> mouseClickedが全て呼ばれたかどうかを記録する。 mousePressedでfalseをセット、mouseClickedでtrueをセットする。
clickedPoint
public Point2D clickedPoint
このクラスのsendResultメソッドの引数に設定する。
draggedRectangle
Rectangle2D draggedRectangle
ドラッグ領域。図形の一括選択に使う。
startPoint
Point2D startPoint
ドラッグ開始点
endPoint
Point2D endPoint
ドラッグ終了点。ドラッグ中は現在点。
ctrl
private int ctrl
マウスボタン2、3が押されたときに、2、3を設定する。mouseClickedメソッドで参照する。
(注) mouseClickedメソッドでは、どのボタンが押されたかは検出できない。

メソッド
説明
start
public void start()
∙ activateListenerを呼んで、MouseListener, MouseMotionListenerをListenerPanelに設定する。
(注) start, endメソッドはコマンドの分岐処理を行うExecCommandから呼ばれる。 図形作成時に画面をドラッグして図形領域を決めるわけだが、 この時にSelectionLSが動作してはまずいのでendメソッドでSelectionLSを停止し、 画面のドラッグが終了するとstartメソッドでSelectionLSを起動する。
end public void end()
∙ activateListener(false) を呼んで、MouseListener, MouseMotionListenerをListenerPanelから削除する。
∙ マウスドラッグに使うフィールドの初期化を実行。
 draggedRectangle=null; draggedStartPoint=null; draggedEndPoint=null;
isMouseListener boolean isMouseListener(MouseListener listener)
∙ ListenerPaneにMouseListenerが設定されているかの問い合わせ。
isMouseMotionListener public boolean isMouseMotionListener(MouseMotionListener listener)
∙ ListenerPanelにMouseMotionListenerが設定されているかの問い合わせ。
activateListener private void activateListener(boolean activate)
∙ MouseListener, MouseMotionListenerをListenerPanelに設定する/解除する。
addSelectionListener public void addSelectionListener(SelectionListener listener)
SelectionLSオブジェクトが図形を選択したときにイベントを受け取るために、SelectionListenerをインプリメントしたオブジェクトを登録する。
removeSelectionListener public void removeSelectionListener(SelectionListener listener)
上記登録したオブジェクトをlistenerListから削除する。
removeSelectionListener public void removeSelectionListener()
listenerListからすべてのオブジェクトを削除する。
fireEvent public void fireEvent(SelectionEvent event)
SelectionLSオブジェクトが図形を選択したときに、listenerListに登録されているオブジェクトに通知する。
mousePressed
public void mousePressed(MouseEvent e)
∙ staticフィールド変数popupTriggerの設定
=> PopupTriggerの取得
∙ マウス右ボタンが押されたか否かのチェック。フィールド変数ctrlにセット。 これはmouseClickedメソッドで参照する。
∙ マウスボタンが図形の選択ボックスを押した場合、図形の移動∙ リサイズコマンドを起動する。
 =>このクラスのprepareMoveResizeCommandメソッドを実行する。
mouseDragged
public void mouseDragged(MouseEvent e)
マウスドラッグによって作られる領域に含まれる全ての図形を選択する。
このメソッドではフィールド変数draggedRectangleにドラッグ領域を設定するだけで、 実際の選択処理はドラッグ領域が確定するmouseRelesedメソッドで行う。
右下から左上に向かってドラッグする場合の矩形領域の作り方に注意。
(注)ドラッグ領域の表示はthis.drawDraggedRectangleメソッドで行う。
mouseReleased public void mouseReleased(MouseEvent e)
mouseReleasedでドラッグ領域領域(フィールド変数draggedRectangle)が確定するので、 このクラスのexecSelectionを呼んで図形の選択処理を行う。
if(this.draggedRectangle!=null) execSelection(cont, this.draggedRectangle);
mouseClicked public void mouseClicked(MouseEvent e)
∙ クリック時にShft keyまたはCtrl keyが押されていたかをチェック。
∙ このクラスのprepareClickedPointCommand メソッドを呼ぶ。
∙ このクラスのexecSelectionを呼び出し図形の選択処理を行う。
∙ ポップアップメニューの起動
このクラスのフィールド変数popupTriggerとMousePositionLS.popupTriggerがともにtrueで、 マウスイベントの処理が全て終了していれば、ExecPopupMenuクラスの showメソッドを呼んでポップアップメニューを起動する。
=> ポップアップメニューの起動
mouseEntered public void mouseEntered(MouseEvent e)
∙ なにもしない
mouseExited public void mouseExited(MouseEvent e)
∙ なにもしない
mouseMoved public void mouseMoved(MouseEvent e)
∙ なにもしない
inEditableTextArea private boolean inEditableTextArea(double X, double Y)
点(X,Y)が編集可能なテキストボックスの内部にあるか否かを判定する。この領域ではマウスをクリックしても図形は選択されないようにする。編集可能なテキストボックスはContainerManager.getEditableTextBoxメソッドで取得できる。
drawDraggedRectangle public void drawDraggedRectangle(Graphics g)
DrawPanelのpaintメソッドから呼ばれる。
∙ マウスドラッグで図形を選択する場合にドラッグ領域を点線枠で描画する。
execSelection public void execSelection(int ctrl, Rectangle2D draggedRectangle)
引数:
ctrl - 0/1/2

Shift/Ctrlキーを押しながらマウスをドラッグまたはクリックすると1または2が設定される。 この場合は続けて図形を選択する。
draggedRectangle - マウスドラッグによる選択領域。クリックのときはdraggedRectangle =null。
処理:
前記1. (1) (2)の選択規則に従って図形選択を行う。 mouseClicked、mouseReleasedメソッドから呼ばれる。
mouseReleasedメソッドから呼ばれる場合はdraggedRectangle内の図形が選ばれているので一般には複数の図形が選択され。 mouseClickedメソッドから呼ばれる場合は選択図形は 1個でdraggedRectangleはnull。

(1) Shape tab (操作説明書 Shape tab) を開く。 javax.swing.JTabbedPane.のsetSelectedIndexメソッドを呼ぶ。
(2) draggedRectangle!=nullの場合

selectInDraggedAreaメソッドを呼ぶ。MousePositionInfoオブジェクトの配列を受け取る。 このオブジェクトは選択図形を保持している。.

(3) draggedRectangle==null (マウスクリック)の場合

MousePositionLSgetMousePositionInfoForSelectionメソッドを呼ぶ。選択候補の図形はMousePositionInfoオブジェクトから取得できる。

(4) PaintStyle.setPaintStyleToMenu メソッドを呼んで、 図形のペイントスタイル(PaintStyle)をツールバーのコンポーネントに設定する。
(5) FontStyle.setFontStyleToMenuメソッドを呼んで、 テキストボックスが保持するテキストのフォントスタイル(FontStyle)をツールバーのコンポーネントに設定する。
execSelectionByDrag public void execSelectionByDrag(int ctrl, Rectangle2D draggedArea)
引数:
ctrl - 0/1/2

Shift/Ctrlキーを押しながらマウスをドラッグすると1または2が設定される。 この場合は続けて図形を選択する。

draggedRectangle - マウスドラッグによる選択領域。
処理:
mouseReleased メソッドから呼ばれる。
(1)selectInDraggedArea メソッドを呼び、 MousePositionInfoオブジェクトの配列を受け取る。
(2) 前記1. (1) (2)の選択規則に従って図形選択を行う。
MousePositionInfoオブジェクトから図形を取得して処理する。
selectInDraggedArea private MousePositionInfo[] selectInDraggedArea(Rectangle2D draggedRectangle)
上のexecSelectionByDragから呼ばれる。 図形を囲む矩形領域(BoundingBox)がドラッグ領域に含まれていれば選択されたと見なしMousePositionを作成して配列で返す。
execSelectionByClick public void execSelectionByClick(int ctrl)
引数:
ctrl - 0/1/2

Shift/Ctrlキーを押しながらマウスをクリックすると1または2が設定される。

処理:
前記1. (1) (2)の選択規則に従って図形選択を行う。
(1)MousePositionLS.getMousePositionInfoForSelection メソッドでMousePositionInfoオブジェクト(一般には複数)を取得する。

このときMousePositionInfoオブジェクトがなければすべての図形の選択を解除する。
取得したMousePositionInfoオブジェクトは一般には複数で優先順位の高い順に配列に格納されている。

(2)最も優先順位の高いのMousePositionInfoから図形を取得し、選択処理を行う。 選択のクリック点がテキストボックス内部ならばそのテキストボックスをselectTextBoxメソッドで編集可能にする。
(3)SelectionEventを作成し、 fireEventメソッドでSelectionListenerインターフェイス を実装したオブジェクトにEventを送る。
selectTextBox
private void selectTextBox(ShapeContainer selectedContainer, MousePositionInfo info, int ctrl)
引数:
selectedContainer - テキストボックスを持つShapeContainerオブジェクト。
info - この引数からクリック点を取り出し、 ShapeContainer.makeTextBoxEditable メソッドでカーソル(キャレット)位置を設定する。
ctrl - 0/1/2

Shift/Ctrlキーを押しながらマウスをドラッグすると1または2が設定される。この場合は続けて図形を選択する。

処理:
図形選択のクリック点がTextBox内部のとき、ShapeContainer.makeTextBoxEditable を呼んでそのTextBoxをeditable(編集可能)にする。
selectAll public void selectAll(boolean select)
∙ 表示中のすべての図形を選択/非選択状態にする。コマンドの分岐処理を行うExecCommandから呼ばれる。
prepareMoveResize
Command
public void prepareMoveResizeCommand(MousePositionInfo mouseInfo, MouseEvent e)
マウスで選択ボックス、リサイズハンドル上などを押したときに、mousePressedメソッドからこのメソッドが呼ばれる。
∙ マウスで押した位置により、図形の移動か、リサイズかを判定する。
∙ 図形の移動またはリサイズコマンドを作成し、ExecCommandを呼ぶ。
prepareClickedPointCommand
public void prepareClickedPointCommand(Point2D point)
mouseClickedメソッドでクリックを検出したときに、CLICKEDPOINTコマンドを作成し、 ExecCommand.execメソッドを呼んでコマンドを実行する。
(注)現在のところ図形をペーストする前にペースト位置を指定するために使用している。
mouseEventCompleted
public boolean mouseEventCompleted()
∙ mousePressed, mouseDragged, mouseReleased, mouseClickedの一連の動作が完了したか否かを問い合わせるメソッド。
∙ MousePositionLSとSelectionLSから呼ばれる。
allMouseEvent
Completed
public boolean allMouseEventCompleted()
∙ ListenerPanelに登録されているmouseListener, mouseMotionListenerをインプリメントしたクラスのmousePressed, mouseDragged, mouseReleased, mouseClickedの一連の動作が完了したか否かを問い合わせるメソッド。
=> ポップアップメニューの起動

: PopupTriggerの取得 戻る=>page top

PopupTriggerはjava.awt.event.MouseEventのisPopupTrigger()メソッドで取得できる。
JavaTM Platform Standard Ed. 6に「mousePressed および mouseReleased の両方で isPopupTrigger をチェックする必要がある」との記述があるので、mousePressed、mouseReleasedメソッドに次の2行を挿入する。 popupTriggerはstaticなフィールド変数。

popupTrigger=false;
if(e.isPopupTrigger()) popupTrigger=true;


2. Interface SelectionListener 戻る=>page top
アクションイベントを受け取るためのリスナーインタフェース。アクションイベントを受け取り処理するクラスは、 このインタフェースを実装する。アクションイベントが発生すると、 SelectionLSがインタフェースをインプリメントしたクラスのオブジェクトの selectedメソッドを呼び出す。
Method Description
selected
public void selected(SelectionEvent event)
アクションが発生したときにSelectionLSから呼び出されるメソッド。.


3. Class SelectionEvent 戻る=>page top
public class SelectionEvent extends EventObject
Field Description
type protected String type="";
図形をクリックして選択したとき"clicked"、マウスドラッグで図形を選択したとき"dragged"。
shapeContainers protected ShapeContainer[] shapeContainers=null;
選択された図形(ShapeContainerオブジェクト)の配列
clickedPoint protected Point2D clickedPoint=null;
図形をクリックして選択したときクリックした点。マウスドラッグで図形を選択したときはnull。

Method Description
getType
public String getType()
typeフィールドを返す。
getSelectedContainers public ShapeContainer[] getSelectedContainers()
shapeContainersフィールドを返す。
getClickedPoint public Point2D getClickedPoint()
clickedPointフィールドを返す。


4. Class UnselectableAreas 戻る=>page top
このクラスは廃止。選択が許されない領域は、編集可能なテキストボックスの内部に限られるので、 inEditableTextArea メソッドのような単純なメソッドで代用できる。
Field Description
typeList ArrayList<String> typeList = new ArrayList<String>()
選択禁止領域の種類を表す文字列。
areaList ArrayList<Shape> areaList = new ArrayList<Shape>()
選択禁止領域をShapeオブジェクトで登録する。
textBoxString String textBoxString = "TextBox"

Method Description
covers
public boolean covers(double X, double Y)
(X,Y)点が選択禁止領域内のときtrueを返す。
covers public boolean covers(double X, double Y, String message)
(X,Y)点が選択禁止領域内のときtrueを返す。
getShapes public Shape[] getShapes()
すべての選択禁止領域をShapeオブジェクトで返す。
setUnselectableAreas public void setUnselectableAreas()
選択禁止領域を検索しtypeListとareaListに登録する。 現在のところ選択禁止領域は変数可能なテキストボックス内部だけなので、 ContainerManager.getEditableTextBox でテキストボックスを取得する。
: このメソッドはSelectionLS.execSelectionメソッドから呼ばれる。 その理由はテキストボックスが編集可能状態に変えるのは、 SelectionLS.execSelectionメソッドだからである。
clearUnselectableAreas public void clearUnselectableAreas()
typeList とareaList.をクリアする。 : このメソッドは SelectionLS.resetSelectionLS から呼ばれる。 またSelectionLS.resetSelectionLS メソッドは PageManagerから呼ばれる。
toString public String toString()
このオブジェクトの文字列表現を返す。


Copyright (c) 2009-2013
All other trademarks are property of their respective owners.