Как нарисовать линию между 2 узлами данных диаграммы в ScalaFX

Я хочу закодировать функцию, которая рисует линию между двумя узлами данных диаграммы скалярного фокуса. У меня есть точечная диаграмма, где я устанавливаю узел моих данных с пользовательским регионом скалярного пространства (потому что я также хочу, чтобы мои данные были стилизованы и размещены). Эта диаграмма в простом макете панели.

Моя функция addLine принимает 2 узла в качестве параметров, получает положение двух узлов в перспективе панели, создает линию и затем добавляет ее в панель.

Моя проблема в том, что линия не соединяет 2 узла, между узлами и начальной и конечной точками линии есть разрыв. Я не понимаю, где я делаю вещи неправильно...

Мой код:

package oscar.visualfx.routing
import java.util.concurrent.{LinkedBlockingQueue, ThreadPoolExecutor,TimeUnit}

import org.apache.commons.lang.time.StopWatch
import oscar.visualfx.VisualFrameScalaFX
import oscar.visualfx.wlp.DeliveryStore
import scalafx.application.{JFXApp, Platform}
import scalafx.geometry.Point2D
import scalafx.scene.Node
import scalafx.scene.chart.XYChart.{Data, Series}
import scalafx.scene.chart.{NumberAxis, ScatterChart}
import scalafx.scene.layout.Pane
import scalafx.scene.paint.Color
import scalafx.scene.shape.Line

class RoutingWindow(nodesPosition: Array[(Int,Int)], vehicles: Range) extends VisualFrameScalaFX("routing") {

  var vehiclesColor: Seq[Color] = Seq()
  val watch = new StopWatch
  val TPE = new ThreadPoolExecutor(1, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue[Runnable])
  val offset = 50
  val Xmax: Int = nodesPosition.map(_._1).max + offset
  val Xmin: Int = nodesPosition.map(_._1).min - offset
  val Ymax: Int = nodesPosition.map(_._2).max + offset
  val Ymin: Int = nodesPosition.map(_._2).min - offset
  val scatterChart = new ScatterChart(new NumberAxis(Xmin, Xmax, 1), new NumberAxis(Ymin, Ymax, 1))
  val nodes: Array[DeliveryStore] = Array.tabulate(nodesPosition.length)(i => new DeliveryStore(nodesPosition(i),i,10))
  val nodesSeries: Series[Number, Number] = new Series[Number, Number] {name = "Nodes"}
  val pane = new Pane()

  Color.getClass.getDeclaredFields.foreach(f => {
    f.setAccessible(true)
    if (f.getName.startsWith("Dark")) {vehiclesColor = vehiclesColor :+ f.get(Color).asInstanceOf[Color]}
  })

  scatterChart.getData.add(nodesSeries)
  nodes.foreach(d => {
    val data = Data[Number, Number](d.pos._1, d.pos._2)
    data.setNode(d)
    nodesSeries.getData.add(data)
  })
  scatterChart.legendVisible = false
  scatterChart.animated = false
  scatterChart.setMinSize(900, 800)
  pane.children.addAll(scatterChart)
  this.setFrameNodes(node = pane)
  this.stage.getScene.getStylesheets.add(getClass.getResource("../css/RoutingWindow.css").toExternalForm)
  this.stage.sizeToScene()
  this.showStage()

  def addLine(startNode: Node, endNode: Node, vehicle: Int): Unit = {
    val startPoint = scatterChart.localToParent(startNode.localToParent(new Point2D(startNode.getBoundsInLocal.getWidth/2, startNode.getBoundsInLocal.getHeight/2)))
    val endPoint = scatterChart.localToParent(endNode.localToParent(new Point2D(endNode.getBoundsInLocal.getWidth/2, endNode.getBoundsInLocal.getHeight/2)))
    val line = new Line {
      fill = Color.White
      stroke = Color.White
      startX = startPoint.getX
      startY = startPoint.getY
      endX = endPoint.getX
      endY = endPoint.getY
      smooth = true
    }
    Platform.runLater({
      this.pane.children.add(line)
      line.toFront()
    })
  }

заранее спасибо

0 ответов

Другие вопросы по тегам