0

scalafx アプリケーションを書き始めたばかりで、バインディングについて質問があります。

プレゼンター クラスに接続ステータスの列挙があり、ビュー クラスのラベルで適切なアイコンを選択したいと考えています。私は基本的にjavafxの方法でバインディングを作成し、ステータスが変化するたびに適切なImageViewを選択するコンバーターを設定できますが、ScalaFXの方法で行うことは可能ですか?

多くのscalafxの例を見ましたが、まだこのようなものを見つけることができません.

ここにいくつかのコードがあります:

package view

import scalafx.beans.property.ObjectProperty

class MainWindowPresenter {
  object DatabaseState extends  Enumeration {
    type DatabaseState = Value
    val NOT_CONNECTED, IDLE, BUSY, ERROR = Value
  }

  val login = new ObjectProperty[String](this, "login", "awesomeloginname")
  val state = new ObjectProperty[DatabaseState.DatabaseState](this, "state", DatabaseState.ERROR)
}

クラスを表示:

package view

import java.util.concurrent.Callable
import javafx.beans.binding.ObjectBinding

import collection.immutable.HashMap

import javafx.scene.control.SeparatorMenuItem

import scala.util.Random
import scalafx.beans.property.{ObjectProperty}
import scalafx.geometry.{Orientation, Insets, Pos}
import scalafx.scene.control._
import scalafx.scene.image.{ImageView, Image}
import scalafx.scene.layout._

import scalafx.Includes._

class MainWindowView extends BorderPane {
  val model = new MainWindowPresenter

  top = new HBox {
    content = List(
      new Label() {
       graphic <== //somehow select imageview depending on model.state
      }
    )
  }

  private def imageFromResource(name : String) =
    new ImageView(new Image(getClass.getClassLoader.getResourceAsStream(name)))
}

事前に感謝し、文法の間違いがあれば申し訳ありません - 英語は私の母国語ではありません.

4

1 に答える 1

0

EasyBindまたはReactFXのスナップショット (2.0-SNAPSHOT) バージョンを使用してバインディングを作成できます。どちらも Java ライブラリですが、Scala から簡単に使用できます。これは EasyBind の方法です。

graphic <== EasyBind.map(model.state, stateToImage)

val stateToImage: Function1[DatabaseState.DatabaseState, ImageView] = {
  // convert state to ImageView
}

Function1このコードは、Scala のから Java の への暗黙的な変換を使用しますFunction

ObjectPropertyScalaFX から EasyBindへの暗黙的な変換を定義して、MonadicObservableValue上記の最初の行を次のように書き換えることもできます。

graphic <== model.state.map(stateToImage)
于 2015-01-30T21:49:51.037 に答える