0

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 ピクセルの線幅) を示しています。

スクリーンショット

どんな助けでも大歓迎です。

4

1 に答える 1