【问题标题】:ScalaFx Bind ImageView to custom EnumerationScalaFx 将 ImageView 绑定到自定义枚举
【发布时间】:2015-03-29 16:08:07
【问题描述】:

我刚开始写 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)))
}

提前致谢,如果有语法错误,我们深表歉意 - 英语不是我的母语。

【问题讨论】:

    标签: scala binding javafx scalafx


    【解决方案1】:

    您可以使用EasyBindReactFX 的快照(2.0-SNAPSHOT)版本来创建绑定。两者都是 Java 库,但它们在 Scala 中很容易使用。这是 EasyBind 方式:

    graphic <== EasyBind.map(model.state, stateToImage)
    
    val stateToImage: Function1[DatabaseState.DatabaseState, ImageView] = {
      // convert state to ImageView
    }
    

    此代码使用从 Scala 的 Function1 到 Java 的 Function 的隐式转换。

    您还可以定义从 ScalaFX ObjectProperty 到 EasyBind 的 MonadicObservableValue 的隐式转换,然后上面的第一行可以重写为:

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

    【讨论】:

    • 谢谢!我现在使用的是 EasyBind 解决方案,但 ReactFX 看起来更有趣,我想我会在以后的代码中使用它。
    • ReactFX 2.0 将吸收来自 EasyBind 的所有功能,其中大部分功能已经包含在快照版本中,但尚未记录在案。所以是的,我建议将来使用 ReactFX。
    猜你喜欢
    • 2013-10-02
    • 2010-10-09
    • 1970-01-01
    • 2011-12-21
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多