Java から Scala にいくつかのコードを移植していますが、「ラバー バンディング」を試みるときにアーチファクトの描画に問題があります。つまり、マウス ポインターで移動する四角形を描画します。
これは Java2D では比較的簡単に実行できましたが、Scala/JavaFX で機能させるには問題があります。
OS/X 10.8.4 で Scala 2.10.2、JavaFX 2.2.0-b21、Java 1.7.0_06 Java HotSpot(TM) 64-Bit Server VM を使用しています。
graphicsContext2D.globalBlendMode = BlendMode.DIFFERENCE は Graphics2D.setXORMode() と同等のようで、ほとんど機能しますが、次のようになります。
- 長方形を塗りつぶすときに、長方形があった場所のかすかな痕跡が残ることがあります。
- 線幅が偶数の整数でない限り、四角形をストロークしても元に戻らない灰色の線を生成します。
- は、線幅が偶数の四角形をストロークすると、四角形があった場所のかすかな痕跡を残すことがあります。
- 親コンポーネントによって提供される背景と適切に XOR しません。
最後のアイテムは私が期待したものではありませんが、それが何をしているのか理解できたと思います (キャンバスの未定義の背景を黒として扱い、描画時に白に、非描画時に黒に XOR します。皮切りに。)
これは、問題を示すテスト ケースです。
import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.scene.paint.Color
import scalafx.Includes._
import scalafx.scene.canvas.{GraphicsContext, Canvas}
import scalafx.scene.layout.Pane
import scalafx.scene.input._
import scalafx.geometry.Rectangle2D
import scalafx.scene.transform.Affine
import scalafx.scene.effect.BlendMode
object Dragger {
var startX: Double = 0.0
var startY: Double = 0.0
var oldRectangle: Rectangle2D = null
def mouseReleased(event: MouseEvent) {
}
def mousePressed(event: MouseEvent) {
startX = event.x
startY = event.y
}
def mouseDragged(g2: GraphicsContext, event: MouseEvent) {
if (oldRectangle != null)
drawRectangle(g2, oldRectangle)
val x0 = math.min(startX, event.x)
val y0 = math.min(startY, event.y)
val newRectangle = new Rectangle2D(x0, y0, math.abs(event.x - startX), math.abs(event.y - startY))
drawRectangle(g2, newRectangle)
oldRectangle = newRectangle
}
def drawRectangle(g2: GraphicsContext, r: Rectangle2D) {
//g2.strokeRect(r.minX, r.minY, r.width, r.height) // <--- stroke instead of fill for grey lines that don't undraw
g2.fillRect(r.minX, r.minY, r.width, r.height)
}
}
object Test extends JFXApp
{
println("javafx.runtime.version: " + System.getProperties.get("javafx.runtime.version"))
println("java.runtime.version: " + System.getProperties.get("java.runtime.version"))
stage = new JFXApp.PrimaryStage {
title = "Hello Stage"
width = 600
height = 472
scene = new Scene {
fill = Color.LIGHTGREEN
root = new Pane {
content = new Canvas(600, 450) {
graphicsContext2D.setStroke(Color.BLUE)
graphicsContext2D.setFill(Color.BLUE)
graphicsContext2D.fillRect(4, 4, 592, 442)
graphicsContext2D.setTransform(new Affine)
graphicsContext2D.globalBlendMode = BlendMode.DIFFERENCE
graphicsContext2D.setStroke(Color.WHITE)
graphicsContext2D.setFill(Color.WHITE)
graphicsContext2D.setLineWidth(1) // <--- increase line width to 2 to fix stroked line undrawing
onMouseDragged = (event: MouseEvent) => {
Dragger.mouseDragged(graphicsContext2D, event)
}
onDragDetected = (event: MouseEvent) => {
//Drag complete
}
onMousePressed = (event: MouseEvent) => {
Dragger.mousePressed(event)
}
onMouseReleased = (event: MouseEvent) => {
Dragger.mouseReleased(event)
}
}
}
}
}
}
このスクリーンショットは、マウスを繰り返し動かした後の問題 (ストロークと 2 ピクセルの線幅) を示しています。
どんな助けでも大歓迎です。