Java Drawing DrawTop

Language

JP  US  UK

 

テストツール

 H. Jyounishi, Tokyo Japan
 

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

要旨:デバッグボタンは標準出力、標準エラー出力を表示するダイアログを画面の下に表示する指示をする。
トレースボタンはデバッグ用の印刷を指示するダイアログを表示する。
このページで説明するクラス: ButtonOfTest, GeometricTest, GeometricTestAction, GeometricTestLS

1. ButtonOfTestクラス 戻る=>page top
1.1 testコマンドのメニュー、メニューアイテム
(a) testコマンドのメニュー (b) geometric testメニューアイテム

図1. testコマンド


1.2 API
public class ButtonOfTest extends JMenuBar implements ActionListener
: ButtonOfTestオブジェクトはDrawMenu.createDebugTestGroup で作成され、ToolBarパネルに加えらる。

フィールド 説明
buttonOfTest static ButtonOfTest buttonOfTest
createTestButtonメソッドで作成されるこのクラスのオブジェクトを設定する。 printMenuItems, getMenuItemメソッドで参照される。
menu JMenu menu
JMenuオブジェクトを設定する。
ButtonOfTestはJMenuBarの拡張クラスで表示は図1(a)のtestボタン。
menuオブジェクトはButtonOfTestに加えられ(add)、図1(a)に示すようにtestボタンの下に表示される。

メソッド 説明
コンストラクタ public ButtonOfTest(String commandName, boolean setText, ImageIcon imageIcon, String tip)
ボタンにはIconとテキストを表示する。コンストラクタではボタンの設定だけを行い、 setMenuItemsメソッドでメニューアイテムの設定を行う。
引数:
commandName - コマンド名。
commandNameをアクションコマンド名にする。ボタンにはcommandNameを表示する。
setText - falseならばIconのみをボタンに表示する。trueならばテキスト(commandName)とIconの両方を表示する。
imageIcon - ボタンに表示するIcon画像。
tip - tool tipに表示する文字列
setStandardButtonStyle public void setStandardButtonStyle()
次のメソッドを呼んで設定する。

this.menu.setFont(MenuConstants.MenuFont);
Border raisedBorder = new BevelBorder(BevelBorder.RAISED);
this.menu.setBorder(raisedBorder);
this.menu.setIconTextGap(0);
this.menu.setOpaque(true);
Color backGround=new Color(0xDDE8F3);
this.menu.setBackground(backGround);
this.menu.setForeground(Color.black);

setSelected public void setSelected(boolean selected)
selectedをmenuに設定する。
isSelected public boolean isSelected()
JMenuのisSelectedメソッドの値を返す。
createTestButton
(static)
public static ButtonOfTest createTestButton(int width)
引数:
width - ボタンの幅。
処理:
例えばgeometric testメニューアイテムの場合、次の設定を行う。

JMenuItem menuItem=new JMenuItem("geometric test");
menuItem.setName("geometric test");
menuItem.setActionCommand("geometric test");
menuItem.addActionListener(buttonOfTest);
menu.add(menuItem);

他のメニューアイテム(図1(a))の場合も同様。
printMenuItems static void printMenuItems()
buttonOfTestフィールドを参照するのでstaticメソッド。
createTestButtonメソッドで作成される ButtonOfTestJMenuオブジェクト(buttonOfTest.menu)の メニューアイテムをプリントする。
getMenuItem static Component getMenuItem(String name)
buttonOfTestフィールドを参照するのでstaticメソッド。 createTestButtonメソッドで作成される ButtonOfTestJMenuオブジェクト(buttonOfTest.menu)の メニューアイテムで名前が引数nameに一致するアイテムを返す。
actionPerformed public void actionPerformed(ActionEvent e)
登録したメニューアイテムに応じた処理を記述する。

(1)geometric testメニューアイテム

GeometricTestオブジェクトを作成し、 GeometricTest.showDialogメソッドを呼ぶ。
表示例 => 図2


(2)draw bounding boxメニューアイテム

DrawParameters.DRAW_BOUNDINGBOXフラグをtrueにする。
実際にbounding boxを表示するメソッドは DrawShapeUtil.drawStandardElementDrawShapeUtil.drawLineElement である。


(3)draw characteristic pointsメニューアイテム

DrawParameters.DRAW_CHARACTERISTIC_POINTSフラグをtrueにする。
実際にcharacteristic pointsを表示するメソッドは DrawShapeUtil.drawCharacteristicMarkである。


(4)draw textLayout boundメニューアイテム

DrawParameters.DRAW_TEXTLAYOUTフラグをtrueにする。
実際にtextLayout boundを表示するメソッドは TextBox.drawTextである。


(5)renumber ContainerListニューアイテム

ContainerManager.ContainerList に格納されているShapeContainershapeIdのシリアル番号をリナンバリングする。 リナンバリングはContainerManager.renumberContainerList で行う。



2. GeometricTestクラス 戻る=>page top
2.1 テスト
GeometricTest、GeometricTestLSは、Newton-Raphson法を使う計算法の安定性をテストする。
Helpタブのtestボタンをクリックし、geometric testアイテムを選択してGeometric testダイアログを表示する(下図)。
(a) マウスポインタからの垂線

(b) マウスポインタからの最短線

図(c) マウスポインタからの8方向射影線

(d) 図形間の交点

(e) 図形間の共通垂線

(f) 図形間の最短線
リンゴのようなグループ図形に対しては、その要素図形ごとに最短線を表示する。
赤線:図形間の共通垂線、青線:曲線の端点、セグメント接続点を結ぶ直線。
図2 Geometric testのテスト項目


(a)Normal Lines From Mouse:

マウスポンターから選択図形への垂線を表示する図(a)。 垂線は一般に複数本存在する。


(b)Shortest Line From Mouse:

マウスポンターから選択図形への最短線を求め表示する。(図(b))。


(c)Projection Lines From Mouse:

マウスポンターから選択図形へ8方向の射影線を求め表示する。(図(c))。


(d)Intersection Pts:

図形を選択し、ほかの図形に重なるように動かすと、交点を赤マークで表示する。(図(d))
複数の図形を動かしてもよい。


(e)Normal Lines Between Shapes:

図形を選択し他の図形に近づけると、2図形間の共通垂線を表示する。(図(e))


(f)Shortest Line Between Shapes:

図形を選択し他の図形に近づけると、2図形間の最短線を表示する。(図(f))
赤線:図形間の共通垂線、青線:曲線の端点、セグメント接続点を結ぶ直線。


2.2 API
public class GeometricTest
フィールド 説明
geometricTestLS GeometricTestLS geometricTestLS=new GeometricTestLS();
マウスリスナーをインプリメントしたgeometricTestLSオブジェクトを設定。
messageLabel JLabel messageLabel
showMessageメソッドでメッセージを表示するラベルのオブジェクトを設定。
NormalLinesFromMouseButton JRadioButton NormalLinesFromMouseButton
垂線計算を指示するボタン。Figure_(a)
ShortestLineFromMouseButton JRadioButton ShortestLineFromMouseButton
最短線計算を指示するボタン。Figure_(b)
ProjectionLinesFromMouseButton JRadioButton ProjectionLinesFromMouseButton
交点計算を指示するボタン。Figure_(c)
IntersectionPtsButton JRadioButton IntersectionPtsButton
交点計算を指示するボタン。Figure_(d)
NormalLinesBetweenShapesButton JRadioButton NormalLinesBetweenShapesButton
図形間の共通垂線計算を指示するボタン。Figure_(e)
ShortestLineBetweenShapesButton JRadioButton ShortestLineBetweenShapesButton
図形間の最短線計算を指示するボタン。Figure_(f)

メソッド 説明
コンストラクタ public GeometricTest()
次の設定を行う。

super(ObjectTable.getDrawMain(), "Geometric test");
this.geometricTestLS=new GeometricTestLS();
this.setName("Geometric test");

showDialog public void showDialog()
ダイアログを次の手順で表示する。
∙ ダイアログがすでに表示されているときは何もしないでリターン。

ダイアログが開いているか否かは getMenuComponentでチェックできる。

GeometricTestActionをウィンドウリスナーとしてこのオブジェクトに設定。
∙ メッセージパネルを作成。
∙ ラジオボタンを設定するパネルを作成。

パネルにボタンを設定しアクションリスナーをボタンに設定する。3個のボタンにグループ設定をする。

∙ this.dialog.setVisible(true)でダイアログを表示する。
∙ このオブジェクトをsetMenuComponentメソッドで MenuComponentListに登録。
showMessage protected void showMessage(String message)
メッセージ表示用ラベルにメッセージを表示。
getGeometricTestLS protected GeometricTestLS getGeometricTestLS()
フィールド変数geometricTestLSを返す。


3. GeometricTestActionクラス 戻る=>page top
class GeometricTestAction extends AbstractAction implements WindowListener
メソッド 説明
actionPerformed public void actionPerformed(ActionEvent e)
∙ NormatLinesFromMouseButtonが押されたとき

GeometricTestLSGeometricTestLS.NormalLinesFromMouse_Modeを設定する。

∙ ShortestLineFromMouseButtonが押されたとき

GeometricTestLSGeometricTestLS.ShortestLineFromMouse_Modeを設定する。

∙ ProjectionLinesFromMouseButtonが押されたとき

GeometricTestLSGeometricTestLS.ProjectionLinesFromMouse_Modeを設定する

∙ IntersectionPtsButtonが押されたとき

GeometricTestLSGeometricTestLS.IntersectionPts_Modeを設定する

∙ NormalLinesBetweenShapesButtonが押されたとき

GeometricTestLSGeometricTestLS.NormalLinesBetweenShapes_Modeを設定する

∙ ShortestLineBetweenShapesButtonが押されたとき

GeometricTestLSGeometricTestLS.ShortestLineBetweenShapes_Modeを設定する

上記Buttonsについて: => Buttons, Geometric testアイテム
closeDialog private void closeDialog()
∙ ダイアログを不可視にする。
GeometricTestLSend メソッドを呼ぶ。
DrawPanelの clearTempShape メソッドで一時的に表示した図形を削除する。
∙ このオブジェクトをMenuComponentList から removeMenuComponentメソッドで削除する。
windowClosing public void windowClosing(WindowEvent e)
closeDialogメソッドを呼ぶ。


4. GeometricTestLSクラス 戻る=>page top
public class GeometricTestLS implements MouseListener, MouseMotionListener マウスの動作を受け取り、マウスが動くたびに垂線計算、最短点、交点計算を実行し結果を表示する。

フィールド 説明
mode int mode
このオブジェクトの動作モードを設定する。
NormalLinesFromMouse_Mode public static int NormalLinesFromMouse_Mode=1;
図(a)の計算を行うモード。
ShortestLineFromMouse_Mode public static int ShortestLineFromMouse_Mode=2;
図(b)の計算を行うモード。
ProjectionLinesFromMouse_Mode public static int ProjectionLinesFromMouse_Mode=3;
図(c)の計算を行うモード。
IntersectionPts_Mode public static int IntersectionPts_Mode=4;
図(d)の計算を行うモード。
NormalLinesBetweenShapes_Mode public static int NormalLinesBetweenShapes_Mode"=5;
図(e)の計算を行うモード。
ShortestLineBetweenShapes_Mode public static int ShortestLineBetweenShapes_Mode=6;
図(f)の計算を行うモード。

メソッド

説明

start public void start()
GeometricTestのshowDialogメソッドから呼ばれ、このオブジェクトをMouseListener, MouseMotionListeneとして、 ListenerPanelに設定する。
end public void end()
GeometricTestActionのcloseDialogメソッドから呼ばれこのオブジェクトを、 ListenerPanelから削除する。
setMode public void setMode(int mode)
GeometricTestAction.actionPerformedメソッドから呼ばれる。 動作モードをチェックしtrueならば、このクラスの drawIntersectionPtsdrawNormalLinesBetweenShapesdrawShortestLinesBetweenShapesを呼んで計算結果を表示する。
mousePressed public void mousePressed(MouseEvent e)
動作モードをチェックしtrueならば、このクラスの drawIntersectionPtsdrawNormalLinesBetweenShapesdrawShortestLinesBetweenShapesを呼んで計算結果を表示する。
mouseDragged public void mouseDragged(MouseEvent e)
同上
mouseReleased public void mouseReleased(MouseEvent e)
同上
mouseMoved public void mouseMoved(MouseEvent e)
動作モードをチェックしtrueならば、このクラスの drawNormalLinesdrawShortestLinedrawProjectionLinesを呼んで計算結果を表示する。
mouseClicked public void mouseClicked(MouseEvent e)
なにもしない。
mouseEntered public void mouseEntered(MouseEvent e)
なにもしない。
mouseExited public void mouseExited(MouseEvent e)
なにもしない。
drawNormalLines protected void drawNormalLines(Point2D point)
引数:
point - マウスカーソルの位置
処理:
ContainerManager.getAllSigleShapeContainers で全ての選択図形を取得。
∙ 現在のマウス位置(point)から、取得した図形への垂線計算をCurve2DUtil.getNormalLinesで実行。
DrawShapeUtil.drawTempShapeで図形上の垂線位置にマークを表示し、 垂線位置を表示する。
=>図(a)
drawShortestLine protected void drawShortestLine(Point2D point)
引数:
point - マウスカーソルの位置
処理:
ContainerManager.getAllSigleShapeContainers で選択されている全ての図形を取得。
∙ 現在のマウス位置(point)から、取得した図形への最短線計算を Curve2DUtil.getShortestLineで実行。
DrawShapeUtil.drawTempShapeで図形上の最短線位置にマークを表示し、 最短線を表示する。
=>図(b)
drawProjectionLines protected void drawProjectionLines(Point2D point)
引数:
point - マウスカーソルの位置
処理:
ContainerManager.getAllSigleShapeContainers で選択されている全ての図形を取得。
∙ 現在のマウス位置(point)から、8方向45°ピッチで選択図形への射影線を Curve2DUtil.getProjectionLinesでk計算。
DrawShapeUtil.drawTempShapeで図形上の射影点位置にマークを表示し、 射影線を表示する。
=>図(c)
drawIntersectionPts protected void drawIntersectionPts()
選択されている図形(複数可)とその他の図形の交点計算を Curve2DUtil.getIntersectionPtsで実行。
DrawShapeUtil.drawTempShapeで交点にマークを表示する。
=>図(d)
drawNormalLinesBetweenShapes protected void drawNormalLinesBetweenShapes()
∙ このクラスのgetClosestShapesで選択図形とそれに最も近い図形(ターゲット図形)を取得。
∙ 選択図形(selectedShape)とターゲット図形(targetShape)のそれぞれについて、その単一図形要素を取得。
図形がグループ図形であることも考慮し、 ShapeContainer.getGroupedSingleShapeContainersメソッド で選択図形とターゲット図形の単一要素図形を配列で取得する。
∙ 共通垂線の計算

このクラスのgetNormalLinesBetweenClosedCoupleメソッド
で選択図形の単一要素図形の配列と、ターゲット図形の単一要素図形の配列の組み合わせに対し、共通垂線計算を行い、 結果をCurve2DUtil.NormalsInfoの配列で返す。

∙ 結果の表示

返されたCurve2DUtil.NormalsInfo を元に計算結果の表示図形を作成し、DrawShapeUtil.drawTempShape で共通垂線と、交点があればそれマークで表示する。

=>図(e)
getClosestShapes protected ShapeContainer[] getClosestShapes()
戻り値:
ShapeContainer[0] に選択されている図形を、 ShapeContainer[1] には選択図形に最も近い図形(ターゲット図形)を返す。 返す図形はグループ図形でも良い。
処理:
選択図形の取得。
選択されている図形ContainerManager.getSelectedContainers メソッドで取得。
∙ ターゲット図形の取得
ContainerManager.getContainersメソッドで全ての図形を取得し、 選択図形とその他の図形を矩形で囲み、矩形間の距離をCurve2DUtil.distanceBetweenBoxesメソッドで計算し、 最も近い図形をターゲット図形とする。
getNormalLinesBetweenClosedCouple protected Vector getNormalLinesBetweenClosedCouple(ShapeContainer selectedShape, ShapeContainer targetShape)
引数:
selectedShape - 選択図形
targetShape - 選択図形に最も近い図形(ターゲット図形)
処理:
∙ 選択図形(selectedShape)とターゲット図形(targetShape)のそれぞれについて、 その単一図形要素を取得。
図形がグループ図形であることも考慮し、ShapeContainer.getGroupedSingleShapeContainersで 選択図形とターゲット図形の単一要素図形を配列で取得する。
∙ 選択図形とターゲット図形の要素図形の組み合わせに対し、共通垂線を計算する。
共通垂線はCurve2DUtil.getNormalLinesBetweenShapesで計算し、 出力データ(Curve2DUtil.NormalsInfo)をVectorオブジェクト(Vector normalLines)に格納する。
∙ normalLinesを戻り値にセットしてリターン。
drawShortestLinesBetweenShapes protected void drawShortestLinesBetweenShapes()
処理:
∙ このクラスのgetClosestShapesで選択図形と それに最も近い図形(ターゲット図形)を取得。
∙ 選択図形(selectedShape)とターゲット図形(targetShape)のそれぞれについて、 その単一図形要素を取得。 図形がグループ図形であることも考慮し、 ShapeContainer.getGroupedSingleShapeContainersで 選択図形とターゲット図形の単一要素図形を配列で取得する。
∙ 最短線の計算
このクラスのgetShortestLinesBetweenClosedCouple メソッドで選択図形の単一要素図形の配列と、ターゲット図形の単一要素図形の配列の組み合わせに対し、最短線計算を行い、 結果をCurve2DUtil.NormalsInfoの配列で返す。
∙結果の表示
返されたCurve2DUtil.NormalsInfoを元に計算結果の表示図形を作成し、 DrawShapeUtil.drawTempShapeで最短線と、 交点があればそれマークで表示する。
=>図(f)
getShortestLinesBetweenClosedCouple protected Vector getShortestLinesBetweenClosedCouple(ShapeContainer selectedShape, ShapeContainer targetShape)
引数:
selectedShape - 選択図形
targetShape - 選択図形に最も近い図形(ターゲット図形)
処理:
∙ 選択図形(selectedShape)とターゲット図形(targetShape)のそれぞれについて、 その単一図形要素を取得。
図形がグループ図形であることも考慮し、 ShapeContainer.getGroupedSingleShapeContainers で選択図形とターゲット図形の単一要素図形を配列で取得する。
∙ 選択図形とターゲット図形の要素図形の組み合わせに対し、最短線を計算する。
最短線はCurve2DUtil.getShortestLineBetweenShapes で計算し、出力データ(Curve2DUtil.NormalsInfo)をVectorオブジェクト(Vector shortestLines)に格納する。
∙ shortestLinesを戻り値にセットしてリターン。


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