- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在TornadoFX中,我想取消订阅自定义事件,以便接收器永远不会再次处理不必要的事件,并且可能避免诸如内存泄漏之类的事情,但是,当我使用unsubscribe<MyEvent>
时我的代码中的方法根本不起作用。这是我的代码的一部分:
object MyEventObj: FXEvent(EventBus.RunOn.BackgroundThread)
class MyEventBus(val personlist:List<PersonOld>): FXEvent()
class MyController: Controller()
{
init
{
subscribe<MyEventObj> {
unsubscribe<MyEventObj> {
println("Unsubscribe event!") //unsubscrib event and make sure the next code just runs once, but never works!
}
println("Event has received!")
val items = listOf(PersonOld("Name A", 20), PersonOld("Name B", 25))
fire(MyEventBus(items))
}
}
}
那么,问题出在哪里呢?以及如何使用unsubscribe
在 TornadoFX 中?感谢您提前帮助我!
最佳答案
unsubscribe
函数将事件监听器作为唯一参数。因此,为了能够取消订阅,您需要将监听器保存为成员 val,以便您可以引用它。更有趣的是,您无法在监听器本身内部引用 this
,因此您需要调用另一个函数才能成功取消订阅。这是一个完整的示例:
object MyEvent : FXEvent()
class MyView : View() {
override val root = stackpane {
paddingAll = 100
button("Fire!") {
setOnAction {
fire(MyEvent)
}
}
}
val myListener: (MyEvent) -> Unit = {
alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.")
stopListening()
}
init {
subscribe(myListener)
}
fun stopListening() = unsubscribe(myListener)
}
如果可以从监听器内部引用监听器,我们可以直接在监听器内部添加一个 unsubscribe()
调用,但这是不可能的,至少在 Kotlin 1.0 中是不可能的。
编辑:我们刚刚添加了一个 times = n
参数来订阅,因此您无需自己处理取消注册的问题。默认情况下,每次事件触发时都会触发您的事件监听器,但通过传递 1
,您可以在第一次后自动取消注册。借助 TornadoFX 1.6.3 中的这一新功能,您可以简单地执行以下操作:
class MyView : View() {
override val root = stackpane {
paddingAll = 100
button("Fire!") {
setOnAction {
fire(MyEvent)
}
}
}
init {
subscribe<MyEvent>(times = 1) {
alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.")
}
}
}
EDIT2: TornadoFX 1.6.3 还将引入触发器操作的 EventContext
,因此您将能够执行 unsubscribe()
> 在下一个版本的事件监听器中。然后您可以将其作为 times
参数的替代方法:
subscribe<MyEvent> {
alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.")
unsubscribe()
}
关于java - 如何取消订阅 TornadoFX 中的 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42465786/
在我的 TornadoFX 应用程序的 View 中,我有一个边框 Pane ,在 View 的左侧和右侧有一个 VBox(中间没有任何内容)。现在,每个 VBox 都有相同的背景颜色,所以它们混合在
在我的 TornadoFX 应用程序的 View 中,我有一个边框 Pane ,在 View 的左侧和右侧有一个 VBox(中间没有任何内容)。现在,每个 VBox 都有相同的背景颜色,所以它们混合在
我的 build.gradle 看起来像这样: plugins { id 'org.jetbrains.kotlin.multiplatform' version '1.3.41' } kot
我已经开始工作 javafx .我想知道 javafx 之间的区别和 Tornadofx .它们之间是如何相互关联和不同的。 还有什么时候用什么。 有没有javafx的情况比 Tornadofx 更有
我想创建一个具有部分透明背景的 View (舞台、窗口)。我有一张包含 Alpha channel 的图像 我在JavaFx中使用了这种场景,我必须将场景填充设置为空,并将根节点背景颜色设置为透明。我
我想知道与TornadoFx相比使用另一功能是否有任何性能优势? 最佳答案 类型安全CSS可以与FXML和类型安全构建器一起使用。您需要将FXML与类型安全构建器进行比较。由于语法的噪音较低,因此生成
我目前遇到的问题之一是我似乎无法更改在动态加载的 AnchorPane 中实现的 Label 的文本。 .我认为这可能与 Controller 以及 JavaFX/TornadoFX 的工作方式有关,
我正在尝试更改选中的背景颜色的行和列表 View 的背景颜色,就像当我执行cell{backgroundColor += Color.BLACK}时一样,但是它删除了或者至少使选择颜色变黑了,我尝试了
在tornadofx 中,我试图验证形式中输入的两个值是否相等。我遵循了this指南,一切正常。但是我遇到了我无法检查输入中的两个值是否相等的方法。 例如,假设我要创建一个简单的注册表单,在该表单中,
是否有类似onFocus()方法的东西,可以像 View 类中的onDock()和onCreate()那样重写? 在文档中只写了关于live reloading的 View 。 我尝试将其与onDoc
我想创建一个具有部分透明背景的 View (舞台、窗口)。我有一张包含 Alpha channel 的图像 我在JavaFx中使用了这种场景,我必须将场景填充设置为空,并将根节点背景颜色设置为透明。我
读完文档后,我仍然对如何在另一个动画完成后执行动画感到有点困惑。我有一个这样的时间表: timeline { keyframe(Duration.seconds(0.5)) { keyva
我是 kotlin 和 tornadoFX 的新手。在 TornadoFX 指南中,可以使用以下内容构建 ToggleButton: togglebutton("OFF").action { text
我一直在尝试 Tornadofx。尝试创建自定义标题栏,这是我目前正在尝试的代码 fun main(args: Array) { launch(args) } class MyApp : Ap
我的任务很简单,但是做不到。 我有Kotlin | Tornadofx应用程序。 我打开fxml屏幕: class MainView : View() { override val root
我在TornadoFX(Kotlin)中有这个TableView: class MainView : View() { val persone = listOf( Pe
当 TornadoFX 窗口关闭时,如何关闭整个应用程序? 对于 JavaFX,通常是: val app = JFrame() app.defaultCloseOperation = JFrame.E
我正在尝试我的第一个应用程序 TornadoFx ,所以我从这段代码开始: package no.tornado.fxsample.workspace import javafx.applicatio
我在 IntelliJ CE 中完成了一个小 tornadofx 应用程序的编写,现在想将其导出为单个文件,供用户下载和启动。现在提供一个 jar 文件就足够了。但是了解如何为 OSX、Windows
我在使用 TorandoFX 找出相对简单的过滤配置时遇到一些困难。我想创建一个基于 SimpleStringProperty 的 FilteredList (由 ObservableList 支持)
我是一名优秀的程序员,十分优秀!