Progressbar TaskStatus 确实监听所有异步运行
Progressbar TaskStatus does listen to all async runs
我举了一个小例子让你们明白我的意思。
通过运行,您会看到在单击黄色区域时会显示进度条...但我只希望在单击绿色区域时显示进度条。
我做错了什么或者这实际上是预期的行为吗?
import javafx.scene.layout.AnchorPane
import javafx.scene.layout.VBox
import tornadofx.*
class RunAsyncExample : View() {
override val root = VBox()
private val runAsyncOne: RunAsyncOne by inject()
private val runAsyncTwo: RunAsyncTwo by inject()
init {
with(root) {
minWidth = 400.0
minHeight = 300.0
add(runAsyncOne)
add(runAsyncTwo)
}
}
}
class RunAsyncOne : View() {
override val root = AnchorPane()
init {
with(root) {
var checker = false
minWidth = 400.0
minHeight = 150.0
style {
backgroundColor += c("YELLOW")
}
setOnMouseClicked {
checker = !checker
runAsync {
while (checker) {
Thread.sleep(100)
println("AsyncOne")
}
}
}
}
}
}
class RunAsyncTwo : View() {
override val root = VBox()
private val status: TaskStatus by inject()
init {
with(root) {
minWidth = 400.0
minHeight = 150.0
setOnMouseClicked {
runAsync {
var b = 0.0
while (b < 100.0) {
b+=1
updateProgress(b, 100.0)
updateMessage("$b / 100.0")
Thread.sleep(100)
println("AsyncTwo")
}
}
}
stackpane {
visibleWhen { status.running }
progressbar(status.progress) {
progress = 0.0
minWidth = 400.0
}
label(status.message)
}
style {
backgroundColor += c("GREEN")
}
}
}
}
当我点击进入绿色区域时:
当我在 AsyncTwo 为 运行、
时单击黄色区域
进度条正在改变,但我不想那样......
当您将 TaskStatus
对象注入您的视图时,您将获得一个 "global" TaskStatus
对象,该对象默认情况下会报告任何异步调用的状态。您想要的是为 RunAsyncTwo
视图创建一个本地 TaskStatus
对象并将其传递给 runAsync
调用。
如果您不将 TaskStatus
对象传递给 runAsync
,将使用您范围的默认值,因此会出现您所看到的行为。这是第二个视图的本地 TaskStatus
对象的示例。另请注意,我使用更合理的语法来定义根节点,您绝对应该选择这种模式:)
class RunAsyncTwo : View() {
private val status = TaskStatus()
override val root = vbox {
minWidth = 400.0
minHeight = 150.0
setOnMouseClicked {
runAsync(status) {
var b = 0.0
while (b < 100.0) {
b += 1
updateProgress(b, 100.0)
updateMessage("$b / 100.0")
Thread.sleep(100)
println("AsyncTwo")
}
}
}
stackpane {
visibleWhen(status.running)
progressbar(status.progress) {
progress = 0.0
minWidth = 400.0
}
label(status.message)
}
style {
backgroundColor += c("GREEN")
}
}
}
我举了一个小例子让你们明白我的意思。
通过运行,您会看到在单击黄色区域时会显示进度条...但我只希望在单击绿色区域时显示进度条。
我做错了什么或者这实际上是预期的行为吗?
import javafx.scene.layout.AnchorPane
import javafx.scene.layout.VBox
import tornadofx.*
class RunAsyncExample : View() {
override val root = VBox()
private val runAsyncOne: RunAsyncOne by inject()
private val runAsyncTwo: RunAsyncTwo by inject()
init {
with(root) {
minWidth = 400.0
minHeight = 300.0
add(runAsyncOne)
add(runAsyncTwo)
}
}
}
class RunAsyncOne : View() {
override val root = AnchorPane()
init {
with(root) {
var checker = false
minWidth = 400.0
minHeight = 150.0
style {
backgroundColor += c("YELLOW")
}
setOnMouseClicked {
checker = !checker
runAsync {
while (checker) {
Thread.sleep(100)
println("AsyncOne")
}
}
}
}
}
}
class RunAsyncTwo : View() {
override val root = VBox()
private val status: TaskStatus by inject()
init {
with(root) {
minWidth = 400.0
minHeight = 150.0
setOnMouseClicked {
runAsync {
var b = 0.0
while (b < 100.0) {
b+=1
updateProgress(b, 100.0)
updateMessage("$b / 100.0")
Thread.sleep(100)
println("AsyncTwo")
}
}
}
stackpane {
visibleWhen { status.running }
progressbar(status.progress) {
progress = 0.0
minWidth = 400.0
}
label(status.message)
}
style {
backgroundColor += c("GREEN")
}
}
}
}
当我点击进入绿色区域时:
时单击黄色区域
进度条正在改变,但我不想那样......
当您将 TaskStatus
对象注入您的视图时,您将获得一个 "global" TaskStatus
对象,该对象默认情况下会报告任何异步调用的状态。您想要的是为 RunAsyncTwo
视图创建一个本地 TaskStatus
对象并将其传递给 runAsync
调用。
如果您不将 TaskStatus
对象传递给 runAsync
,将使用您范围的默认值,因此会出现您所看到的行为。这是第二个视图的本地 TaskStatus
对象的示例。另请注意,我使用更合理的语法来定义根节点,您绝对应该选择这种模式:)
class RunAsyncTwo : View() {
private val status = TaskStatus()
override val root = vbox {
minWidth = 400.0
minHeight = 150.0
setOnMouseClicked {
runAsync(status) {
var b = 0.0
while (b < 100.0) {
b += 1
updateProgress(b, 100.0)
updateMessage("$b / 100.0")
Thread.sleep(100)
println("AsyncTwo")
}
}
}
stackpane {
visibleWhen(status.running)
progressbar(status.progress) {
progress = 0.0
minWidth = 400.0
}
label(status.message)
}
style {
backgroundColor += c("GREEN")
}
}
}