差分情報適用後の実行イメージ

差分情報

パッチファイル (Unified diffs)

--- ColorPanel.java	Mon Jun 01 05:12:13 2009
+++ ColorPanel.java	Sun Jun 14 10:52:27 2009
@@ -26,12 +26,24 @@
 
 	// 以降、ボタンやパネルなどのコンポーネント関連の宣言
 
-	public JPanel jPanelSelectedColor = null;// 選択色表示パネル(自作イベントハンドラ作成前に、一時的にpublicで凌いでいる。。。)
+	private JPanel jPanelSelectedColor = null;
 
 	private JScrollPane jScrollPaneColorChooser = null;
 
 	private JColorChooser jColorChooser = null;
 
+	// 色は2色まで選択できる
+
+	public JPanel jPanelSelectedColor1 = null; // 色1
+
+	public JPanel jPanelSelectedColor2 = null; // 色2
+
+	private int selectedColorNumber = 0; // どちらの色が選択されているか
+
+	private static final int COLOR_1 = 0;
+
+	private static final int COLOR_2 = 1;
+
 	// --------------------------------------------------
 	// コンストラクタ
 	// --------------------------------------------------
@@ -39,8 +51,10 @@
 		// 部品の配置
 		this.add(getJPanelSelectedColor());
 		this.add(getJScrollPaneColorChooser());
+
 		// 選択色の初期化
-		jPanelSelectedColor.setBackground(clr);
+		setColor(clr);
+
 		jColorChooser.setColor(clr);
 	}
 
@@ -49,16 +63,32 @@
 	// --------------------------------------------------
 	public void setColor(Color clr) {
 		// 色を設定する
-		jPanelSelectedColor.setBackground(clr);
+		if (selectedColorNumber == COLOR_1)
+			jPanelSelectedColor1.setBackground(clr);
+		else
+			jPanelSelectedColor2.setBackground(clr);
+
 		jColorChooser.setColor(clr);
 	}
 
 	// --------------------------------------------------
 	// 選択色の取得
 	// --------------------------------------------------
-	public Color getColor() {
-		// 選択色パネルの色を返す
-		return jPanelSelectedColor.getBackground();
+
+	// アクティブな色を返す
+	public Color getActiveColor() {
+		if (selectedColorNumber == COLOR_1)
+			return jPanelSelectedColor1.getBackground();
+		else
+			return jPanelSelectedColor2.getBackground();
+	}
+
+	// 非アクティブな色を返す
+	public Color getNonActiveColor() {
+		if (selectedColorNumber == COLOR_2)
+			return jPanelSelectedColor1.getBackground();
+		else
+			return jPanelSelectedColor2.getBackground();
 	}
 
 	// ----------------------------------------------------------------------------------------------------
@@ -70,7 +100,41 @@
 		if (jPanelSelectedColor == null) {
 			jPanelSelectedColor = new JPanel();
 			jPanelSelectedColor.setPreferredSize(new Dimension(102, 102));
-			jPanelSelectedColor.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); // 枠(浮き出しベベル)
+			jPanelSelectedColor.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); // 枠(掘り込みベベル)
+
+			// 自由レイアウトにする
+			jPanelSelectedColor.setLayout(null);
+
+			// 色1
+			jPanelSelectedColor1 = new JPanel();
+			jPanelSelectedColor1.setBounds(10, 10, 50, 50); // 座標とサイズ
+			jPanelSelectedColor1.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); // 枠(浮き出しベベル)
+			// マウス押下イベントリスナ(ボタンを浮き出させ、選択を切り替える)
+			jPanelSelectedColor1.addMouseListener(new java.awt.event.MouseAdapter() {
+				public void mousePressed(java.awt.event.MouseEvent e) {
+					jPanelSelectedColor1.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
+					jPanelSelectedColor2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
+					selectedColorNumber = COLOR_1;
+				}
+			});
+			jPanelSelectedColor.add(jPanelSelectedColor1);
+
+			// 色2
+			jPanelSelectedColor2 = new JPanel();
+			jPanelSelectedColor2.setBounds(42, 42, 50, 50); // 座標とサイズ
+			jPanelSelectedColor2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); // 枠(掘り込みベベル)
+			// マウス押下イベントリスナ(ボタンを浮き出させ、選択を切り替える)
+			jPanelSelectedColor2.addMouseListener(new java.awt.event.MouseAdapter() {
+				public void mousePressed(java.awt.event.MouseEvent e) {
+					jPanelSelectedColor1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
+					jPanelSelectedColor2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
+					selectedColorNumber = COLOR_2;
+				}
+			});
+			jPanelSelectedColor.add(jPanelSelectedColor2);
+
+			// 初期選択は色1
+			selectedColorNumber = COLOR_1;
 		}
 		return jPanelSelectedColor;
 	}
@@ -93,7 +157,11 @@
 			// 選択色の変更イベント
 			jColorChooser.getSelectionModel().addChangeListener(new ChangeListener() {
 				public void stateChanged(ChangeEvent e) {
-					jPanelSelectedColor.setBackground(jColorChooser.getColor()); // 選択色表示パネルに選択色を表示する
+					// 選択色表示パネルに選択色を表示する
+					if (selectedColorNumber == COLOR_1)
+						jPanelSelectedColor1.setBackground(jColorChooser.getColor());
+					else
+						jPanelSelectedColor2.setBackground(jColorChooser.getColor());
 				}
 			});
 
--- PaintTool.java	Mon Jun 01 05:12:13 2009
+++ PaintTool.java	Sun Jun 14 10:46:07 2009
@@ -15,7 +15,8 @@
 public abstract class PaintTool {
 
 	// ペン色
-	public Color penColor;
+	public Color mainPenColor; // メインで使われるペン色
+	public Color subPenColor; // サブで使われるペン色
 
 	// ペンサイズ
 	public float penSize;
--- PtBrush.java	Mon Jun 01 05:12:13 2009
+++ PtBrush.java	Sun Jun 14 09:15:32 2009
@@ -103,7 +103,7 @@
 	// --------------------------------------------------
 	public void Paint(Point2D.Double p1, Point2D.Double p2, Graphics2D g2d, BufferedImage img) {
 		// ペン色を設定
-		g2d.setPaint(penColor);
+		g2d.setPaint(mainPenColor);
 
 		// 丸ブラシの場合は、ペンサイズと領域を設定後、押印と補完により、円を描写する
 		if (brushState == OPTION_00 || brushState == OPTION_01) {
--- PtEraser.java	Mon Jun 01 05:12:12 2009
+++ PtEraser.java	Sun Jun 14 11:03:30 2009
@@ -8,10 +8,12 @@
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Graphics2D;
+import java.awt.geom.Line2D;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import javax.swing.BorderFactory;
+import javax.swing.JCheckBox;
 import javax.swing.JPanel;
 import javax.swing.JButton;
 import javax.swing.ImageIcon;
@@ -23,6 +25,9 @@
 	// 矩形
 	Rectangle2D.Double rect = new Rectangle2D.Double();
 
+	// 直線
+	Line2D.Double line = new Line2D.Double();
+
 	// オプション状態番号
 
 	private static final int OPTION_1 = 0;
@@ -49,6 +54,8 @@
 
 	public JButton jButton5 = null;
 
+	public JCheckBox isColorEraser = null; // カラー消しゴムモードを決めるためのチェックボックス
+
 	// --------------------------------------------------
 	// コンストラクタ
 	// --------------------------------------------------
@@ -63,22 +70,46 @@
 	// Paint()をオーバーライド
 	// --------------------------------------------------
 	public void Paint(Point2D.Double p1, Point2D.Double p2, Graphics2D g2d, BufferedImage img) {
-		// ペン色は常に白色にする
-		g2d.setColor(Color.white);
+		// カラー消しゴムモードの場合
+		if (isColorEraser.isSelected()) {
+			
+			// 消しゴムサイズ(縦×横)のピクセル領域を走査する
+			for (int x = 0; x < (int) super.penSize; x++) {
+				for (int y = 0; y < (int) super.penSize; y++) {
+					
+					// マウスの座標があるキャンバスの色素を取得する
+					Point2D.Double p = new Point2D.Double(p2.x + x, p2.y + y);
+					Color clr = new Color(img.getRGB((int) p.x, (int) p.y));
+
+					// キャンバスの取得色とサブペン色が一致すれば、メインペン色で上書きする
+					if (super.subPenColor.getRGB() == clr.getRGB()) {
+						g2d.setPaint(mainPenColor);
+						line.setLine(p, p);
+						g2d.draw(line);
+					}
+				}
+			}
 
-		// 押された座標に、消しゴムサイズに合わせた矩形を描写する
-		Dimension dim = new Dimension((int) super.penSize, (int) super.penSize);
-		rect.setFrame(p2, dim);
-		g2d.fill(rect);
-
-		// 前回の座標と今回の座標が異なれば、それらの区間を補完するための描写を行う
-		if (!p1.equals(p2)) {
-			// 2点間の距離を算出
-			double range = Math.sqrt(Math.pow((p1.x + p2.x), 2.0F) + Math.pow((p1.y + p2.y), 2.0F));
-			// 補完処理
-			for (int i = 0; i < range; i++) {
-				rect.setFrame(new Point2D.Double(p1.x + ((p2.x - p1.x) / range) * i, p1.y + ((p2.y - p1.y) / range) * i), dim);
-				g2d.fill(rect);
+		}
+		// 通常消しゴムモードの場合
+		else {
+			// ペン色は常に白色にする
+			g2d.setColor(Color.white);
+
+			// 押された座標に、消しゴムサイズに合わせた矩形を描写する
+			Dimension dim = new Dimension((int) super.penSize, (int) super.penSize);
+			rect.setFrame(p2, dim);
+			g2d.fill(rect);
+
+			// 前回の座標と今回の座標が異なれば、それらの区間を補完するための描写を行う
+			if (!p1.equals(p2)) {
+				// 2点間の距離を算出
+				double range = Math.sqrt(Math.pow((p1.x + p2.x), 2.0F) + Math.pow((p1.y + p2.y), 2.0F));
+				// 補完処理
+				for (int i = 0; i < range; i++) {
+					rect.setFrame(new Point2D.Double(p1.x + ((p2.x - p1.x) / range) * i, p1.y + ((p2.y - p1.y) / range) * i), dim);
+					g2d.fill(rect);
+				}
 			}
 		}
 	}
@@ -129,6 +160,11 @@
 		if (jPanelLayout == null) {
 			jPanelLayout = new JPanel();
 			jPanelLayout.setLayout(new BoxLayout(getJPanelLayout(), BoxLayout.Y_AXIS)); // Y軸方向に整列させる
+
+			// カラー消しゴムモードを決めるためのチェックボックス
+			isColorEraser = new JCheckBox("カラ消し");
+			jPanelLayout.add(isColorEraser);
+
 			jPanelLayout.add(getJButton1());
 			jPanelLayout.add(getJButton2());
 			jPanelLayout.add(getJButton3());
--- PtFill.java	Mon Jun 01 05:12:13 2009
+++ PtFill.java	Sun Jun 14 09:15:32 2009
@@ -33,7 +33,7 @@
 	// --------------------------------------------------
 	public void Paint(Point2D.Double p1, Point2D.Double p2, Graphics2D g2d, BufferedImage img) {
 		// 塗りつぶしメソッドの呼び出し
-		seedFill((int) p2.x, (int) p2.y, penColor, g2d, img);// 塗りつぶし地点、塗りつぶし色、などを引数として渡す
+		seedFill((int) p2.x, (int) p2.y, mainPenColor, g2d, img);// 塗りつぶし地点、塗りつぶし色、などを引数として渡す
 	}
 
 	// --------------------------------------------------
--- PtPencil.java	Mon Jun 01 05:12:13 2009
+++ PtPencil.java	Sun Jun 14 09:15:32 2009
@@ -29,7 +29,7 @@
 	// --------------------------------------------------
 	public void Paint(Point2D.Double p1, Point2D.Double p2, Graphics2D g2d, BufferedImage img) {
 		// 前回の座標と今回の座標を、選択されているペン色で、直線で結ぶ
-		g2d.setPaint(penColor);
+		g2d.setPaint(mainPenColor);
 		line.setLine(p1, p2);
 		g2d.draw(line);
 	}
--- ReviewPaintMain.java	Mon Jun 01 05:12:12 2009
+++ ReviewPaintMain.java	Sun Jun 14 10:56:45 2009
@@ -124,7 +124,9 @@
 		this.setContentPane(getJContentPane()); // コンポーネントの読み込み
 
 		jPanelCanvasPaper.ptool = changeMainButton(PAINT_TOOL_STATE_PENCIL); // ペイントツールのデフォルト選択の指定
-		jPanelCanvasPaper.ptool.penColor = colorPanel.getColor(); // ペン色の設定
+		
+		jPanelCanvasPaper.ptool.mainPenColor = colorPanel.getActiveColor(); // メインペン色の設定
+		jPanelCanvasPaper.ptool.subPenColor = colorPanel.getNonActiveColor(); // サブペン色の設定
 	}
 
 	// ----------------------------------------------------------------------------------------------------
@@ -203,13 +205,37 @@
 	private JPanel getColorPallet() {
 		if (colorPanel == null) {
 			colorPanel = new ColorPanel(Color.black); // カラーパレットの選択色の初期色は黒色
+			
 			// カラーパレットの選択色パネルに直接アクセスしてイベントリスナを登録し、色の変更を監視する(強引な一時凌ぎです。。。><)
-			colorPanel.jPanelSelectedColor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
+			colorPanel.jPanelSelectedColor1.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
 				public void propertyChange(java.beans.PropertyChangeEvent e) {
 					if ((e.getPropertyName().equals("background"))) {
-						jPanelCanvasPaper.ptool.penColor = colorPanel.jPanelSelectedColor.getBackground(); // ペン色を変更する
+						jPanelCanvasPaper.ptool.mainPenColor = colorPanel.getActiveColor(); // メインペン色の変更
+						jPanelCanvasPaper.ptool.subPenColor = colorPanel.getNonActiveColor(); // サブペン色の変更
 					}
 				}
+			});			
+			colorPanel.jPanelSelectedColor2.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
+				public void propertyChange(java.beans.PropertyChangeEvent e) {
+					if ((e.getPropertyName().equals("background"))) {
+						jPanelCanvasPaper.ptool.mainPenColor = colorPanel.getActiveColor(); // メインペン色の変更
+						jPanelCanvasPaper.ptool.subPenColor = colorPanel.getNonActiveColor(); // サブペン色の変更
+					}
+				}
+			});
+			
+			// カラーパレットのメインペン色が切り替わった際に実行されるイベント
+			colorPanel.jPanelSelectedColor1.addMouseListener(new java.awt.event.MouseAdapter() {
+				public void mousePressed(java.awt.event.MouseEvent e) {
+					jPanelCanvasPaper.ptool.mainPenColor = colorPanel.getActiveColor(); // メインペン色の変更
+					jPanelCanvasPaper.ptool.subPenColor = colorPanel.getNonActiveColor(); // サブペン色の変更
+				}
+			});
+			colorPanel.jPanelSelectedColor2.addMouseListener(new java.awt.event.MouseAdapter() {
+				public void mousePressed(java.awt.event.MouseEvent e) {
+					jPanelCanvasPaper.ptool.mainPenColor = colorPanel.getActiveColor(); // メインペン色の変更
+					jPanelCanvasPaper.ptool.subPenColor = colorPanel.getNonActiveColor(); // サブペン色の変更
+				}
 			});
 		}
 		return colorPanel;
@@ -274,32 +300,38 @@
 		case PAINT_TOOL_STATE_PENCIL:
 			jButtonPencil.setBorder(activeToolBoder); // 押下ツールのボタンを選択状態にする
 			layout.show(jPanelToolOption, "pencil"); // 押下ツールのオプションパネルを表示する
-			pt_pencil.penColor = colorPanel.getColor(); // 押下ツールのペン色は、前回のツールのペン色を引き継ぐ
+			pt_pencil.mainPenColor = colorPanel.getActiveColor(); // 押下ツールのメインペン色は、前回のツールのペン色を引き継ぐ
+			pt_pencil.subPenColor = colorPanel.getNonActiveColor(); // 押下ツールのサブペン色は、前回のツールのペン色を引き継ぐ
 			return pt_pencil; // 押下ツールのインスタンスを返す
 		case PAINT_TOOL_STATE_ERASER:
 			jButtonEraser.setBorder(activeToolBoder);
 			layout.show(jPanelToolOption, "eraser");
-			pt_eraser.penColor = colorPanel.getColor();
+			pt_eraser.mainPenColor = colorPanel.getActiveColor();
+			pt_eraser.subPenColor = colorPanel.getNonActiveColor();
 			return pt_eraser;
 		case PAINT_TOOL_STATE_BRUSH:
 			jButtonBrush.setBorder(activeToolBoder);
 			layout.show(jPanelToolOption, "brush");
-			pt_brush.penColor = colorPanel.getColor();
+			pt_brush.mainPenColor = colorPanel.getActiveColor();
+			pt_brush.subPenColor = colorPanel.getNonActiveColor();
 			return pt_brush;
 		case PAINT_TOOL_STATE_FILL:
 			jButtonFill.setBorder(activeToolBoder);
 			layout.show(jPanelToolOption, "fill");
-			pt_fill.penColor = colorPanel.getColor();
+			pt_fill.mainPenColor = colorPanel.getActiveColor();
+			pt_fill.subPenColor = colorPanel.getNonActiveColor();
 			return pt_fill;
 		case PAINT_TOOL_STATE_AIRBRUSH:
 			jButtonAirbrush.setBorder(activeToolBoder);
 			layout.show(jPanelToolOption, "airbrush");
-			pt_airbrush.penColor = colorPanel.getColor();
+			pt_airbrush.mainPenColor = colorPanel.getActiveColor();
+			pt_airbrush.subPenColor = colorPanel.getNonActiveColor();
 			return pt_airbrush;
 		case PAINT_TOOL_STATE_SPUIT:
 			jButtonSpuit.setBorder(activeToolBoder);
 			layout.show(jPanelToolOption, "spuit");
-			pt_spuit.penColor = colorPanel.getColor();
+			pt_spuit.mainPenColor = colorPanel.getActiveColor();
+			pt_spuit.subPenColor = colorPanel.getNonActiveColor();
 			return pt_spuit;
 		default:
 			return null;
@@ -411,7 +443,7 @@
 			jPanelToolOption = new JPanel();
 			layout = new CardLayout(); // カードレイアウトを使用する
 			jPanelToolOption.setLayout(layout);
-			jPanelToolOption.setPreferredSize(new Dimension(105, 134)); // パネルサイズ
+			jPanelToolOption.setPreferredSize(new Dimension(105, 158)); // パネルサイズ
 			jPanelToolOption.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); // 枠(掘り込みベベル)
 			// 各種ペイントツールのオプションを登録する
 			jPanelToolOption.add(pt_pencil.jPanel, "pencil");

変更後のファイル

変更の種類 変更後のファイル 変更前後の比較
修正 /branches/modify_eraser/ColorPanel.java Side-by-side diffs
修正 /branches/modify_eraser/PaintTool.java Side-by-side diffs
修正 /branches/modify_eraser/PtBrush.java Side-by-side diffs
修正 /branches/modify_eraser/PtEraser.java Side-by-side diffs
修正 /branches/modify_eraser/PtFill.java Side-by-side diffs
修正 /branches/modify_eraser/PtPencil.java Side-by-side diffs
修正 /branches/modify_eraser/ReviewPaintMain.java Side-by-side diffs
リンク先は リポジトリ上のURLです