JAvaにおけるグラフィックボードの基本的な実現

11124 ワード

1.まず、JFrameでグラフィックパネルを書くインタフェースです.
           (1)マウスの押下と解放時の座標を取得するためにインタフェースにリスナーを追加する必要がある.これはアクションリスナー(ActionListener)を使用することはできず、マウスリスナー(MouseListener)を使用してこそ座標を取得することができる.
 
                ActionListener:Buttonなどの動作に注目するコンポーネントにListener(addActionListener);)を追加し、イベント処理方法(public void actionPerformed(ActionEvent event){})では各イベントに対して異なる処理を行うことができます.
                MouseListener:コンポーネント上の「興味のある」マウスイベント(押す、放す、クリックする、入る、離れる)を受信するリスナーインタフェース.(マウスの移動とドラッグを追跡するには、  MouseMotionListener.)マウスイベントを処理するためのクラスは、このインタフェース(およびその含まれるすべての方法)を実装するか、抽象クラスを拡張するかのいずれかである.  MouseAdapter(必要なメソッドのみを書き換える).
            (2)シェイプを描画するには、javaでGraphicsオブジェクト、またはキャンバスオブジェクトと呼ばれるペイント権限を取得する必要があります.フォームからオブジェクトを取得し、マウスリスナーオブジェクトを作成し、キャンバスオブジェクトをリスナーに渡すことができます.最後にフォームにマウスリスナーオブジェクトを追加すると、フォームでマウスを押したり放したりすると、この2つの位置の座標が取得されます.キャンバスオブジェクトの描画方法を最後に呼び出す(オブジェクト.drawline()
2.DrawMouseなどのイベント処理クラスを再定義し、インタフェースMouseListener、ActionListener、MouseMotionListenerを継承します.
              (1)まず,Graphicsオブジェクトをインスタンス化して伝達されたブラシオブジェクトを受け入れる.
	private Graphics gr;//    

	public void setGraphics(Graphics g) { //     ,   
		gr = g;
	}
             (2)文字列配列を用いて画図ボタンの上の文字列(すなわちグラフィック名)やColorクラスの配列格納ボタンの背景色を格納するため,ActionListenerインタフェースにおけるactionPerformedメソッドを書き換える際には,まずボタン上の顔色や文字を取得し,取得したのが文字でない場合には,クリックしたのが色ボタンであることを説明する.ボタンの色を読み取り、ブラシの色を設定します.文字を読み取る場合は、次の操作を続行する必要があります.実装コードは次のとおりです.
                  e.getSource()メソッドはイベントオブジェクトに依存する.
                          例えば、JButton jbt=new JButton(「直線」);中イベントオブジェクトはjbtです
                  e.getActionCommand()メソッドはボタン上の文字列に依存する
                          例えば、JButton jbt=new JButton(「直線」);中文字列button
                  簡単に言えば、e.getSource()ではjbt、e.getActionCommand()ではbuttonが得られます.
               (3)他の継承を実現する方法を書き換える
                        JAvaにはグラフィックを描く方法がたくさんあり、グラフィックを描くには一定数の座標値x,yを取得する必要があります.継承されたインタフェースのメソッドにはMouseEventタイプのパラメータeがあり、getx()、gety()を呼び出すことで、クリック、解放、クリックなどの操作を経た現在位置のx座標およびy座標を取得できます.
                       ブラシのインスタンス化オブジェクト呼び出しdrawline(x 1,y 1,x 2,y 2)メソッドで直線を描くことができます
	public void mousePressed(MouseEvent e) {
		System.out.println("  ");
			x1 = e.getX();
			y1 = e.getY();
}
	public void mouseReleased(MouseEvent e) {
		System.out.println("  ");
            x2 = e.getX();
			y2 = e.getY();
		if (name.equals("  ")) {
			gr.drawLine(x1, y1, x2, y2);
		}
		if (name.equals("  ")) {
			gr.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
		}
}
                             ブラシオブジェクトgrを使用してdrawRext()を呼び出す方法で長方形を描きます(円形は同じで、円形は長方形を描く方法で内接円形を描きます).なお、座標(x 1,y 1)は矩形左上角の点、すなわちx 1を表し、y 1はいずれも最小値である.したがってmathクラスはサイズ値、絶対値をとる必要があります.
                              Javaには三角形を描く関数が定義されていないため,1つの変数の操作で花の3本の直線を制御する方法で実現する必要がある.多角形同理
private int count = 1;
	public void mouseClicked(MouseEvent e) {
		System.out.println("  ");
		if (name.equals("   ") && count == 2) {
			x3 = e.getX();
			y3 = e.getY();
			gr.drawLine(x2, y2, x3, y3);
			if (e.getClickCount() == 2) {
				gr.drawLine(x1, y1, x3, y3);
				count = 1;
			}
		}
	public void mousePressed(MouseEvent e) {
		System.out.println("  ");
		if (count == 1) {
			x1 = e.getX();
			y1 = e.getY();

		}
	public void mouseReleased(MouseEvent e) {
		System.out.println("  ");
		if (count == 1) {
			x2 = e.getX();
			y2 = e.getY();
		if (name.equals("   ") && count == 1) {
			gr.drawLine(x1, y1, x2, y2);
		}
    }
3.再描画
              フォームを作成するときにフォームのサイズを定義しました.フォームのサイズを変更すると、元のフォームは表示のニーズを満たしません.フォーム上のすべてのコンポーネントをもう一度再描画し、JFrameとJPanelで定義されたpaintメソッドを自動的に呼び出します.そのため、フォームクラスにJFrameクラスまたはJPanelクラスを継承させ、paint()メソッドを書き換える必要があります.
              しかし、フォームのサイズを変更する前に多くのグラフィックが描画されていたため、多くの座標を保存して再描画する必要があるため、データを格納してから書き換えるpaintメソッドで直接使用するオブジェクト配列を新規作成する必要があります.
             (1)  まず、グラフィックデータを保存するためのshapeクラスを作成し、新しい配列オブジェクトを作成します.
	/**
	 *                 
	 */
	public Shape(int x1, int y1, int x2, int y2, String name, Color color) {
		if (name.equals("  ") || name.equals("  ") || name.equals("  ")) {
			this.x1 = x1;
			this.y1 = y1;
			this.x2 = x2;
			this.y2 = y2;
			this.name = name;
			this.color = color;
		} 
	}

}
               (2)イベント処理クラスDrawMouseで配列オブジェクトと配列コーナーマークindexを作成する.図形を描くたびに配列に保存します.点、三角形、多角形、曲線、消しゴム、反復図形は、2点で描画されるdrawline()であるため、直線に保存して再描画すればよい.
	private Shape[] shapeArray;
	private int index = 0;//       
	public void setShapeArray(Shape[] shapeArray) {//     
		this.shapeArray = shapeArray;
	}
		if (name.equals("  ")) {
			gr.drawLine(x1, y1, x2, y2);
			Shape shape = new Shape(x1, y1, x2, y2, "  ", gr.getColor());//   shape             
			shapeArray[index] = shape;
			index++;
		}
		if (name.equals("  ")) {
			gr.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
			Shape shape = new Shape(x1, y1, x2, y2, "  ", gr.getColor());
			shapeArray[index] = shape;
			index++;
		}
                  (3)三角形と多角形の描画は複数の直線によって描画されるので,1本の直線を描くごとに配列に1回データが保存される.
        
        if (name.equals("   ") && count == 1) {
			gr.drawLine(x1, y1, x2, y2);
			Shape shape = new Shape(x1, y1, x2, y2, "  ", gr.getColor());
			shapeArray[index] = shape;
			index++;
			count++;
		}
        
		if (name.equals("   ") && count == 2) {
			x3 = e.getX();
			y3 = e.getY();
			gr.drawLine(x2, y2, x3, y3);
			Shape shape = new Shape(x2, y2, x3, y3, "  ", gr.getColor());
			shapeArray[index] = shape;
			index++;
			if (e.getClickCount() == 2) {
				gr.drawLine(x1, y1, x3, y3);
				Shape shape1 = new Shape(x1, y1, x3, y3, "  ", gr.getColor());
				shapeArray[index] = shape1;
				index++;
				count = 1;
			}
		}
多角形count==2(つまり2回目のクリック)または閉じた図形をダブルクリックした場合
		if (name.equals("   ") && count == 2) {
			x3 = e.getX();
			y3 = e.getY();
			gr.drawLine(x2, y2, x3, y3);
			Shape shape = new Shape(x2, y2, x3, y3, "  ", gr.getColor());
			shapeArray[index] = shape;
			index++;
			x2 = x3;
			y2 = y3;
			System.out.println("    ");
			if (e.getClickCount() == 2) {
				gr.drawLine(x1, y1, x3, y3);
				Shape shape1 = new Shape(x1, y1, x3, y3, "  ", gr.getColor());
				shapeArray[index] = shape1;
				index++;
				System.out.println("    ");
				count = 1;
			}
		}
                 (4)データをすべて配列に保存した後,インタフェースクラスでJFrameまたはJPanelを継承し,paintメソッドを書き換える.
                   まずインタフェースクラスでイベント処理クラスDrawMouseのsetShapeArrayメソッドを呼び出す  ,メソッドをインタフェースクラスの配列オブジェクトに渡します.
dr.setShapeArray(shapeArray);
                         superは親を指します.thisはこのクラスを指します.
	//         
	public void paint(Graphics gr) { 
		super.paint(gr);                     //        
		System.out.println("  !");
		for (int i = 0; i < shapeArray.length; i++) {
			Shape shape = shapeArray[i];     //      shape  
			if (shape != null) {             //        
				shape.drawshape(gr);         //  shape     drawshape
			} else {
				break;
			}
		}
	}
	//   shapeArray          ,  
                  (5)shapeクラスでの再描画方法
	//              
	public void drawshape(Graphics gr) {
		switch (name) {
		case "  ":
			gr.setColor(color);
			gr.drawLine(x1, y1, x2, y2);
			break;
		case "  ":
			gr.setColor(color);
			gr.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
			break;
		case "  ":
			gr.setColor(color);
			gr.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
			break;
		case"   ":
			gr.setColor(color);
			gr.fillRect(x1, y1, 50, 50);
			break;
		}
	}