前提・実現したいこと
現在、JavaFXを使ってペイントアプリのようなものを作っています。
Windows標準ペイントでいうペンは実装できたのですが、消しゴムがうまく実装できません。
調べた範囲では削除関係はGraphicsContext.clearRectぐらいしか見つからず、
消しゴムとは言い難いので他の方法を探しています。
ちなみにレイヤー構造で背景が透明なので白で上書きという手段が使えません。
解決策や代替案等があれば教えていただけると嬉しいです。
該当のソースコード
Java
1public class AppCanvas extends Canvas{ 2 /* 3 * 書き込み専用キャンバスクラス 4 */ 5 6 //グラフィック 7 private GraphicsContext g; 8 9 //直前座標 10 private double befoer_x = -1; 11 private double befoer_y = -1; 12 13 public AppCanvas(double x,double y) { 14 15 this.setWidth(x); 16 this.setHeight(y); 17 18 g = this.getGraphicsContext2D(); 19 20 //描画設定 21 g.setLineWidth(3); 22 23 //マウスボタン押し込み時処理登録 24 EventHandler<MouseEvent> dragg = ( event ) -> draggMouse(event); 25 this.addEventHandler( MouseEvent.MOUSE_DRAGGED , dragg ); 26 27 //マウスドラッグ時処理登録 28 EventHandler<MouseEvent> press = ( event ) -> pressMouse(event); 29 this.addEventHandler( MouseEvent.MOUSE_PRESSED , press ); 30 31 //マウス離したときの処理登録 32 EventHandler<MouseEvent> release = ( event ) -> releaseMouse(event); 33 this.addEventHandler( MouseEvent.MOUSE_RELEASED , release ); 34 } 35 36 /* 37 * マウス押し込み初回 38 */ 39 void pressMouse(MouseEvent event) { 40 41 //消しゴムの場合は透過色に,それ以外は黒に 42 if(XXXX) { 43 g.setFill(Color.TRANSPARENT); //ここで透過色で塗りつぶしを試しましたが、消しゴムにはならず 44 g.setStroke(Color.TRANSPARENT); 45 }else { 46 g.setFill(Color.BLACK); 47 g.setStroke(Color.BLACK); 48 } 49 50 //現在座標で点を描画 51 g.strokeLine(befoer_x, befoer_y , befoer_x, befoer_y); 52 53 //直前座標を記録 54 befoer_x = event.getX(); 55 befoer_y = event.getY(); 56 } 57 58 /* 59 * マウスドラッグ 60 */ 61 void draggMouse(MouseEvent event) { 62 63 //直前座標が存在しない場合終了 64 if(befoer_x < 0) { 65 return; 66 } 67 68 //今回座標と直前座標を線で結ぶ 69 g.strokeLine(befoer_x, befoer_y , event.getX(), event.getY()); 70 71 //今回の座標を直前座標に登録 72 befoer_x = event.getX(); 73 befoer_y = event.getY(); 74 } 75 76 /* 77 * マウス離す 78 */ 79 void releaseMouse(MouseEvent event) { 80 81 //前回座標を無効する 82 befoer_x = -1; 83 befoer_y = -1; 84 } 85}
試したこと
・削除関係の処理はClearRect以外見つけられませんでした。
・ドラッグ部分をfillOvalにして動作確認した際、線を引いたら破線になっていたためClearRect連続実行も効果が無いと思われます。
・上記ソースに記載がありますが、透明色で上書きは効果無かったです。
補足情報(FW/ツールのバージョンなど)
Eclipse
Java11
JavaFx
回答1件
あなたの回答
tips
プレビュー