- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 ScalaFX 并尝试了解它是如何工作的。作为一个实验(不是我将在生产中做的),我想要一种获取窗口标题的方法。
所以这是我的 Graph.scala 文件:
package graphing
import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.scene.paint.Color
class Graph {
val app = new JFXApp {
stage = new JFXApp.PrimaryStage {
title = "First GUI"
scene = new Scene {
fill = Color.Coral
}
}
}
def getTitle() = {
app.stage.getTitle
}
def generateChart(args: Array[String]) = app.main(args)
}
package graphing
import graphing.Graph
object Driver extends App {
val graph = new Graph
println(graph.getTitle())
graph.generateChart(args)
}
println(graph.getTitle())
最佳答案
这里的问题涉及JavaFX(以及ScalaFX)初始化。
初始化 JavaFX 是一项复杂的业务。 (事实上,我最近才知道它比我最初认为的还要复杂。有关更多背景信息,请参阅 StackOverflow 上的 this recent answer。幸运的是,您的问题更容易解决。)
ScalaFX 极大地简化了 JavaFX 初始化,但需要 JFXApp
trait 被用作 object
定义的一部分.JFXApp
包含 main
方法,它必须是你的应用程序的起点;正是这种方法为您处理了初始化 JavaFX 的复杂性。
在您的示例中,您有 Driver
对象扩展 scala.App
, 所以它是 App
的(因此,Driver
的)main
方法成为您自己的应用程序的起点。这对于常规命令行界面 (CLI) 应用程序来说很好,但如果没有大量额外的复杂性,它就不能与 ScalaFX/JavaFX 应用程序一起使用。
在您的代码中,JFXApp
的main
方法永远不会执行,因为它被定义为类成员,它不是 main
Scala 的方法 object
,因此不是 JVM 自动执行的候选对象。您确实可以从 Graph.generateChart()
手动调用它。方法,但是直到您尝试获取场景的标题之后才调用该方法本身,因此作为舞台的 NPE 尚未初始化。
如果你把 graph.generateChart(args)
在 println(graph.getTitle())
之前调用陈述?那会修复它吗?可悲的是没有。
这就是为什么...JFXApp
还执行了另一项魔术:它执行其object
的构造代码。 (以及由该对象扩展的任何其他 class
es,但不适用于扩展的 trait
s)在 JavaFX 应用程序线程 (JAT) 上。这很重要:只有在 JAT 上执行的代码才能直接与 JavaFX 交互(即使通过 ScalaFX)。如果您尝试在任何其他线程(包括应用程序的主线程)上执行 JavaFX 操作,则会出现异常。
(这个魔法依赖于一个已弃用的 Scala 特征 scala.DelayedInit
,它已从 Scala 3.0 的库中删除,即 Dotty,因此 future 将需要不同的机制。但是,对于该特征,值得一读 the documentation了解更多背景信息。)
所以,当 Driver
的构造代码调用graph.generateChart(args)
,它会导致 JavaFX 被初始化,启动 JAT,并执行 Graph
的施工规范就可以了。然而,到了 Driver
的构造函数调用 println(graph.getTitle())
,它仍然在主线程上执行,有两个问题:
Graph
的构造代码可能已执行,也可能未执行,因为它是在不同的线程上执行的。 (这个问题被称为竞态条件,因为在试图调用 println(graph.getTitle())
的主线程和试图初始化 graph
实例的 JAT 之间存在竞态。)在某些情况下你可能会赢得比赛,但你是也会经常输。 package graphing
import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.scene.paint.Color
object GraphDriver
extends JFXApp {
// This executes at program startup, automatically, on the JAT.
stage = new JFXApp.PrimaryStage {
title = "First GUI"
scene = new Scene {
fill = Color.Coral
}
}
// Print the title. Works, because we're executing on the JAT. If we're NOT on the JAT,
// Then getTitle() would need to be called via scalafx.application.Platform.runLater().
println(getTitle())
// Retrieve the title of the stage. Should equal "First GUI".
//
// It's guaranteed that "stage" will be initialized and valid when called.
def getTitle() = stage.title.value
}
Graph
类和
Driver
对象合并为单个对象,
GraphDriver
.虽然我不确定您的应用程序在架构上需要什么样的外观,但这对您来说应该是一个不错的起点。
scala.App
根本不使用。
GraphDriver.getTitle()
:此代码需要在 JAT 上执行。执行任何可能在不同线程上运行的代码的标准解决方法是将其按名称传递给
scalafx.application.Platform.runLater()
。 .例如:
import scalafx.application.Platform
// ...
Platform.runLater(println(ObjectDriver.getTitle()))
// ...
关于ScalaFX - 如何使用方法获取场景的标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62109858/
我附上了一个我尝试使用 html/css 实现的示例(如果您看不到图像:名字和姓氏,然后第二行是职位描述)。我希望所有文本(两行)在一个 div 中强制对齐(左和右),但我不确定这是否可能。我尝试了一
我想使两个 h1 元素成为 div 上的标题/页眉。所以每个都在特定的 div 之上。 Youtube Achievements
我想让每个 EditText 对象都有自己的标题,就像 Pure Android 指南中那样 (screenshot) 这个东西有原生支持吗?我想他们也可能会使用带有部分的 ListView ,但这对
是否可以像 UITableView headerView 一样创建 UICollectionView 标题 View ?我的意思是整个集合 View 的标题 View ,而不是每个部分的重复 View
我一直在遵循有关排版的 Google 官方 Material 设计指南 (http://www.google.com/design/spec/style/typography.html),但我发现它们
我目前正在尝试找到可以帮助我从视频文件中提取元数据或信息的 python 库,例如 [ mp4, Mkv, Avi, WebM, mpg ] 格式为例。 我主要从视频文件中提取的主要数据是 [标题、描
你好, 这是我正在尝试做的: 将每个缩略图的内容(img + 标题)居中。我的 img 必须是 span3,标题必须是 span4。 这是我的问题: 我可以获取内容中心,或者标题 float 在 im
我有一个带有导航栏的应用程序,可以从一个 View Controller 导航到下一个 View Controller 。在某些模拟器和设备上导航到下一个 View Controller 时,后退按钮
我遇到了一些非常酷的 t-sql,可以从一个 t-sql 查询中的选定行生成一个逗号分隔的列值列表: SELECT @MyList = ISNULL(@MyList,'') + Title + ',
请确保将 HTML heading 标签只用于标题。不要仅仅是为了生成粗体或的文本而使用标题。 搜索引擎使用标题为您的网页的结构和内容编制索引。 因为用户可以通过标题来快速浏览您的网页,所以用标
我正在使用 wkhtmltopdf 将 html 转换为 pdf。 我想在每个页面中添加标题,但它只显示在第一页(目录)中。 我使用的命令是 "C:\Program Files\wkhtmltopdf
如何使用 ggplot2 显示观察的方向(标题)?有没有办法调整shape=17 (三角形)以便它“指向”下一次观察? 示例代码 library(ggplot2) dat % pivot_wide
我尝试在 cocoa 应用程序中显示/隐藏标题栏。我使用以下代码: if ([window styleMask]==NSResizableWindowMask) { [wind
我有这样的 HTML 标题 http://s1.postimg.org/4ebyk3qwv/image.png 当我编写这段代码时: document.getElementById("TL85_1_
我叫麦克。谢谢你的帮助。 在Wordpress中,我们已经设计了我们的网站,以便在Facebook调试器中og数据尽可能接近youtube。尽管如此,在Facebook上共享视频的方式还是不同的。尽管
从 web 应用程序的客户端,我点击了服务器端路由,它只是第三方 API 的包装器。使用分派(dispatch),我试图让服务器端请求返回 exact header 和第三方 API 对客户端 AJA
从 web 应用程序的客户端,我点击了服务器端路由,它只是第三方 API 的包装器。使用分派(dispatch),我试图让服务器端请求返回 exact header 和第三方 API 对客户端 AJA
我是 SAPUI5 的新手,在导航、侧边栏和标题方面遇到一些问题。我想开发一个带有标题和侧边栏的应用程序。我为此使用“ToolPage”。每个页面都包含工具页,如下所示:
我最近在为客户做的项目中被介绍给Go。他们已经建立了代码库,需要进行一些更改。 我注意到所有的方法,结构等等都有一些奇怪的类似于标题的注释,如下所示: // SomeType ... type Som
我创建了一个采用整个屏幕布局的标题布局(xml 文件)... 我还创建了一个 listView 并将此 header_layout 添加到 listView 中: LayoutInflater inf
我是一名优秀的程序员,十分优秀!