如何在JavaFX/ScalaFX应用程序中运行Akka actor?
(这是基于第一个答案的问题更新)
解决方案是共享相同的执行上下文吗?是否有基于JavaFx ExecutorService的Actors调度程序?(运行UI操作代码的那个)
这是否意味着一个代理将代表UI并能够操纵它?我的意思是因为如果在UI ExecutorService上有几个actor,建议如下,这是不是意味着在代理(对象是UI)之间共享一个状态?
2个演员可以在不同的执行器服务上进行通信吗?我问这个是因为根据下面的建议,一些代理将在UI Executor服务上,而其他代理不在.
最后,为什么使用akka,它的Executor上下文不同并使用Platform.runLater,可能会对UI的性能产生一些影响.我在同一个应用程序中提出了多个执行程序服务的问题:那是不是很糟糕?
我正在尝试使用JavaFX和Scala实现一个带有一些思维导图功能的简单笔记组织器.
我试图决定是否应该直接从Scala或通过ScalaFX调用JavaFX代码?我不知道是否值得学习ScalaFX,从Scala代码直接调用JavaFX会不会更简单?
该官方网站ScalaFX提到ScalaFX的4个好处:
1)自然语言绑定表达
- 这很好,但我并没有真正计划使用那么多的绑定(我打算使用EventBus进行inter-gui-component事件和一些gui-component事件的绑定).
2)量身定制的动画语法
- 我不打算在我的项目中使用动画.
3)完全类型安全的API
这似乎是一个微不足道的点......类型安全是Java开发人员一直拥有的(并且通常认为是理所当然的),而其他脚本语言的开发人员则没有(并且因此在不知不觉中遭受运行时错误).但是,如果您正在开发在部署后无法出现意外运行时错误和错误的应用程序,则这是一项关键功能.
一个好的编译器将能够通过比较预期和实际类型来获取许多常见的编码错误,并且一个优秀的编译器(如Scala)将自动为您推断类型,因此您不必在整个代码中重复这些错误.
ScalaFX使用类似脚本的DSL语法获得两全其美,您很少需要显式地键入对象,Scala编译器具有强大的类型安全性,可以推断并检查每个表达式和API调用的类型.这意味着花费更少的时间来调试奇怪的代码错误和拼写错误,以及更高质量的代码!
- 这看起来很有趣!但我的问题是:我怀疑直接从Scala调用JavaFX给了我与通过ScalaFX调用JavaFX相同的类型安全保证吗?我不知道.
4)无缝JavaFX/ScalaFX互操作性:
- 如果我直接从Scala调用JavaFX,那么与通过ScalaFX调用JavaFX相比,我不必担心互操作性问题.
综上所述:
似乎第3点是唯一可以在我的简单项目中给我一些我关心的好处,但我不知道他们真正在谈论什么类型的安全性?
为什么通过ScalaFX调用JavaFX比直接从Scala调用类型安全更好?如果我们使用ScalaFX而不是Scala直接访问,我们会获得什么样的额外类型安全优势?我问这个是因为我无法想象ScalaFX可以提供什么样的额外类型安全性?
所以,换句话说,我知道ScalaFX对于绑定来说是一个很好的语法糖,但是它提供了更多吗?如果我可以在没有(非常好的)合成糖的情况下生活,我真的应该使用它吗?
除了糖之外还有什么东西可以使用这个包装层(ScalaFX)来引入额外的复杂性(和bug的来源)吗?
请注意,我非常感谢ScalaFX创作者的工作!我只是要求这些问题能够做出更明智的决定.
我尝试在scalaFx应用程序中编写事件处理程序.我找到了以下解决方案:
import scalafx.scene.control.ListView
import javafx.scene.input.MouseEvent
import javafx.event.EventHandler
...
    val list = new ListView[String] {
        onMouseClicked = new EventHandler[MouseEvent] {
            override def handle(event: MouseEvent) {
                doSomething(event)
            }
        }
    }
但这似乎是非常Java风格的样板代码.有没有办法用这样的第一类函数做到这一点?
        onMouseClicked = (event: MouseEvent) => doSomething(event)
编译说:
使用javafx.scene.input.MouseEvent,javafx.scene.input.MouseEvent => scalafx.delegate.SFXDelegate [javafx.scene.input.MouseEvent]中没有隐式视图.
我创建了一个计算某些东西的算法.这可以被视为模型.该算法以完全功能的方式实现,因此它仅使用不可变类.现在使用这个模型,我想在它的顶部开发一个GUI层.但是我对Scala中构建GUI的最佳实践一无所知.我打算使用ScalaFX.
我的问题如下:在ScalaFX中(类似于JavaFX),您可以将GUI中的值绑定到对象属性.这显然违反了功能范例,但似乎非常方便.这将需要重写我的类以使用可绑定的属性,这可能感觉像是摇尾巴的尾巴 - 模型将取决于GUI.
另一方面,我可以有一个独立的GUI层.在这种情况下,我需要代理对象来绑定,我将不得不基于这些代理对象创建我的模型对象.这会更加惯用,但意味着大量的代码重复和额外的工作.我的模型和代理对象必须保持同步,我将不得不处理复制属性.
这样做的好方法是什么?GUI总是充满了可变性,因此功能编程在这里感觉不到.不过我喜欢Scala,所以我也想继续使用它作为GUI.
我是Scala和SBT的新手,所以我可能会遗漏一些明显的东西.
我试图在http://www.scalafx.org/docs/quickstart/上编译HelloWorld示例
我创建了一个文件build.sbt包含:
scalaVersion := "2.11.5"
libraryDependencies += "org.scalafx" %% "scalafx" % "8.0.0-R4"
以及src/main/scala/ScalaFXHelloWorld.scala包含链接页面代码的文件.
但是,当sbt run我跑步时,我得到:
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
[info] Set current project to scalafx (in build file:/home/kvbx/Projects/ScalaFX/)
[info] Compiling 1 Scala source to /home/kvbx/Projects/ScalaFX/target/scala-2.11/classes...
[error] missing or invalid dependency detected while loading class file 'Color.class'.
[error] Could not access term javafx in package <root>,
[error] because it (or its dependencies) are …我正在为介绍性编程学生编写一个图像库.(我从DrRacket的图像库中偷走了这个想法和模式.)
https://github.com/dupontmanualhs/dm-image
它主要用Swing编写(这是master分支),但我试图将其转换为ScalaFX(参见scalafx分支),并且存在一些问题.理想情况下,学生应该能够做以下事情:
scala> import org.dupontmanual.image._
scala> TrainEngine.display()
并有一个显示火车引擎的对话框.我已经尝试过使用代码了
https://github.com/scalafx/ScalaFX-Tutorials
在stand-alone-dialog项目中,但如果我System.exit(0)在我之后包含dialog.showAndWait(),我会收到此错误:
Not interrupting system thread Thread[process reaper,10,system]
Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
    at com.sun.glass.utils.Disposer.run(Disposer.java:69)
    at java.lang.Thread.run(Thread.java:744)
Not interrupting system thread Thread[Prism Font Disposer,10,system]
Exception in runnable
Exception in thread "JavaFX Application Thread"
(请注意,如果我尝试在控制台中运行Appfrom ,我会得到相同的错误stand-alone-dialog,因此我猜测System.exit(0)在SBT控制台中调用不是一个好主意.)
如果我离开这System.exit(0)条线路,那么事情似乎也很好 - 大多数情况下.在我第一次显示对话框后,它不会使对话框成为焦点,因此我必须单击它才能关闭对话框.但真正的问题是,当我:q退出控制台时,SBT挂起,我必须Ctrl-C能够再次打字.(并且,是的,Ctrl-C完全退出SBT,而不仅仅是控制台.)
我想我可能需要做的是专门为ScalaFX创建一个线程.例如,我有一种方法可以将一个图像堆叠在另一个图像的顶部, …
环境:
我scalafx-hello-world从GitHub签出了,并在IntelliJ中构建并运行了它,一切正常。这里快速介绍重要的应用程序实现:
package hello
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.geometry.Insets
import scalafx.scene.Scene
import scalafx.scene.effect.DropShadow
import scalafx.scene.layout.HBox
import scalafx.scene.paint.Color._
import scalafx.scene.paint._
import scalafx.scene.text.Text
object ScalaFXHelloWorld extends JFXApp {
  stage = new PrimaryStage {
    //    initStyle(StageStyle.Unified)
    title = "ScalaFX Hello World"
    scene = new Scene {
      fill = Color.rgb(38, 38, 38)
      content = new HBox {
        padding = Insets(50, 80, 50, 80)
        children = …我是 ScalaFx 的新手,想要创建一个 TableView,其中包含带有CheckBoxs 的可编辑布尔列(以及带有 TextFields 的可编辑字符串和整数列)。我想我需要使用CheckBoxTableCell. 我使用的是 JDK 7u25、ScalaFX 1.0.0-M4/M5 和 Scala 2.10.2-final。(我不完全确定 ScalaFX 版本,但它肯定至少是 1.0.0-M5。无论如何,这是 Jarek 于 8 月 1 日上传到https://oss.sonatype.org/index.html#nexus的快照-search;quick~scalafx。Jarek 只编译 Scala 2.9.x,但我已经下载了他的源代码并重新编译了它。)
我已经成功地基于ScalaFX TableView 中的整数列,http://foofighter2146.blogspot.com/2013/06/tutorial-scalafx-slick.html和 scalafx-demo: SimpleTableView使其工作一半。但是,我无法在 TableView 中使用 CheckBox 并使用它们的值。相反,我只能让它以这样的方式工作:我需要输入“true”或“false”来编辑表中的值。
到目前为止,这是我已经成功完成的工作:
class Person(firstName_ : String, age_ : Int, cool_ : Boolean) {
  val name = new StringProperty(this, "Name", firstName_)
  val age = new IntegerProperty(this, "Age", age_)
  val cool = new ObjectProperty(this, "Cool", cool)
}
object SimpleEditableTableView …检查这种意外的行为,我只是把一个TextArea直接进入Scene载有PrimaryStage:在应用程序启动时,TextArea正好适合窗口(如预期)。
但是TextArea如果我移动窗口的边框,它的大小不会改变,这是我试图解决的问题。
这是我的 ScalaFX 代码(我希望它的行为与它的 JavaFX 等效代码完全一样):
object MyApp extends JFXApp {
  stage = new PrimaryStage {
    title = "My App"
    resizable = true // has no effect
    maxWidth = Double.MaxValue // has no effect
    maxHeight = Double.MaxValue // has no effect
    val outputDisplay = new TextArea {
      resizable = true // has no effect
      maxWidth = Double.MaxValue // has no effect
      maxHeight = Double.MaxValue // has no effect …由于这两个System.setProperty("prism.lcdtext", "false")和System.setProperty("prism.lcdtext", "true")不令人满意(前出现霜霉病,而后者出现在即使文本颜色为黑色字母边缘丰富多彩;我的液晶显示器上,它看起来甚至比难看这里报道:https://bugs.openjdk.java.net/浏览/JDK-8131923 ),
我更喜欢完全关闭抗锯齿。
该设置SceneAntialiasing.DISABLED似乎不会影响我的按钮/列表/下拉菜单/...(我猜它仅用于绘图)。
如何完全关闭抗锯齿?我想使用一种类似于 Windows 2000 和 Win XP 的第一个版本的字体,它们无需抗锯齿即可工作(此外还可以节省空间,因为它们可以缩小而不是必须平滑的字体)。
[更新] 截图已添加(根据要求)
右侧窗口由我的 ScalaFX 应用程序生成。纯普通标准代码,不应用任何设置。
(玩System.setProperty("prism.lcdtext", "false")和System.setProperty("prism.text", "t2k")给了我稍微好一点的,但仍然不令人满意的结果。)
请看放大的“W”及其多种颜色,它源自右侧窗口 (JavaFX) 中的第一个按钮:对于要求苛刻的用户来说,这是无法忍受的。并请比较等宽文本的平滑度(左:Ubuntu,右:JavaFX)。
scala ×10
scalafx ×10
javafx ×7
java ×3
javafx-2 ×2
akka ×1
immutability ×1
java-platform-module-system ×1
openjdk-11 ×1
sbt ×1