我正在为入门编程学生编写一个图像库来玩。(我从 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)
在 I 之后包含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"
(请注意,如果我尝试在控制台中运行App
from ,我会遇到同样的错误stand-alone-dialog
,所以我猜测System.exit(0)
在 SBT 控制台中调用不是一个好主意。)
如果我把这System.exit(0)
条线排除在外,那么一切似乎都很好——大多数情况下。在我第一次显示对话框后,它不会使对话框成为焦点,所以我必须单击它来关闭对话框。但真正的问题是,当我:q
退出控制台时,SBT 挂起,我必须Ctrl-C
能够再次输入。(而且,是的,Ctrl-C
完全退出 SBT,而不仅仅是控制台。)
我想我可能需要做的是专门为 ScalaFX 的东西创建一个线程。例如,我有一种方法将一个图像堆叠在另一个图像之上,IllegalStateException
当我尝试调用该函数时,我得到了一个,即使它实际上并没有显示任何内容,只是创建了一个新Group
的,前两个Node
s 适当堆叠。不幸的是,我不确定如何创建一个新线程并确保所有与图像相关的内容都通过它。
我已经设置好fork := true
了build.sbt
,但这似乎与控制台没有什么不同。
== 更新 ==
我在 SBT 文档中找到initialCommands
并cleanupCommands
尝试在控制台启动和结束时清理所有内容。这些值为:
initialCommands in console := """import org.dupontmanual.image._; org.dupontmanual.image.initialize()"""
cleanupCommands in console := """org.dupontmanual.image.cleanUp()"""
其定义如下:
package object image {
var masterFrame: JFrame = _
def initialize() {
masterFrame = new JFrame()
masterFrame.add(new JFXPanel())
masterFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
}
def cleanUp() {
println("exiting platform")
Platform.exit()
println("disposing of frames")
Frame.getFrames().foreach {
_.dispose()
}
println("frames all disposed")
System.exit(0);
}
这是运行控制台然后尝试退出的结果:
> console
[info] Compiling 1 Scala source to /home/sysadmin/dm-workspace/dm-image/target/scala-2.10/classes...
[info] Starting scala interpreter...
[info]
import org.dupontmanual.image._
Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_51).
Type in expressions to have them evaluated.
Type :help for more information.
scala> Hacker.display()
scala> :q
exiting platform
disposing of frames
frames all disposed
Not interrupting system thread Thread[XToolkt-Shutdown-Thread,5,system]
Not interrupting system thread Thread[AWT-XAWT,6,system]
Not interrupting system thread Thread[Prism Font Disposer,10,system]
Not interrupting system thread Thread[Java2D Disposer,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)
Exception: sbt.TrapExitSecurityException thrown from the UncaughtExceptionHandler in thread "run-main-0"
这甚至不会退出控制台。您仍然必须使用 Ctrl-C,它会完全退出 SBT。
有些东西还在运行,但我不知道它是什么。嗯。