Py学习  »  Edvin Syse  »  全部回复
回复总数  7
6 年前
回复了 Edvin Syse 创建的主题 » 如何在TornadoFx表视图中显示POJO属性?

你需要引用属性,而不是getter。 User::id . 要引用不可变属性,需要使用 readonlyColumn 建设者:

readonlyColumn("id", User::id)
readonlyColumn("name", User::name)

也就是说,您确实应该在域对象中使用javafx属性。在基于JavaFX的应用程序中不这样做只会使所有事情变得更困难,并且您可以从很多好处中解脱出来,或者至少您必须跳出困境。

下面是用可观察的JavaFX属性编写的完整应用程序。请注意,然后您将访问 idProperty nameProperty 而不是属性。使用此方法,对基础数据项的更改也将自动在TableView中可见:

class User(id: Int, name: String) {
    val idProperty = SimpleIntegerProperty(id)
    var id by idProperty

    val nameProperty = SimpleStringProperty(name)
    var name by nameProperty
}


private val data = listOf(User(111, "AAA"), User(222, "BBB"), User(333, "CCC"), User(444, "DDD")).observable()

class HelloWorld : View() {
    override val root = vbox {
        tableview(data) {
            column("id", User::idProperty)
            column("name", User::nameProperty)
        }
    }
}

要保持配置更改,只需调用 save() 在配置对象上。要保存全局应用程序配置设置,请致电 app.config.save() . 应用程序启动时自动加载更改。

您可以阅读指南中有关配置对象的更多信息:

https://github.com/edvin/tornadofx-guide/blob/master/part2/Config%20Settings%20and%20State.md

6 年前
回复了 Edvin Syse 创建的主题 » 在TornadoFx中使用工作区时如何使用范围?

这个 App 已经定义了 Scope 与相应的 Workspace 例如,当你的初始 View 停靠在 工作空间 你的新 ParentScope 定义新的 工作空间 实例。当你停靠 ChildView 进入 工作空间 它确实做到了这一点,但相关的工作区不会显示在屏幕上。

要解决这个问题,您可以这样覆盖应用程序的主要作用域:

class TestApp : WorkspaceApp(ParentView::class) {
    init {
        scope = ParentScope()
    }
}

还请注意,我使用 WorkspaceApp 子类,因此我不需要停靠 ParentView 手动。

在研究这个问题时,我意识到,如果您将一个ui组件停靠到一个工作区中,那么它应该假定它已经停靠在一个工作区中。出于这个原因,我已经提交了一个修复程序,这样您的初始代码就可以在不进行修改的情况下工作。

6 年前
回复了 Edvin Syse 创建的主题 » Kotlin Fx-TornadoFx应用程序可以作为Web应用程序部署吗?

您可以用JavaFX做任何事情,也可以用TornadoFX做任何事情,因为它基本上是JavaFX之上的一个更高级别的API。

JavaFX本身没有针对Web的渲染功能,但jpro通过使用WebSockets将JavaFX用户界面直接“渲染”为SVG,非常巧妙地实现了这一点。

事实上,Tornadofx有特殊的支持,可以更容易地创建基于jpro的应用程序。

你的出发点是 https://www.jpro.one/

TornadoFx指南还包含有关如何使用JPRO的信息:

https://github.com/edvin/tornadofx-guide/blob/master/part2/Scopes.md#using-tornadofx-with-jpro

JPRO是一种商业产品,在编写时(2018-11-20),一台具有8GB内存的服务器每月启动AV 99欧元。每个用户都会得到自己的应用程序实例,尽管仍然在同一个JVM中运行。

虽然这个系统工作得非常好,但它最适合在客户机和服务器之间存在低延迟、最好是高带宽的情况下使用,因为每个事件都将通过WebSocket连接进行传输。对于面向公众的网页来说,这通常是一个糟糕的选择,但它是可行的。事实上, http://jpro.one 实际上是一个javafx应用程序!

免责声明:我与jpro没有任何关系,我只是告诉你让javafx应用程序通过浏览器可用的唯一方法。

6 年前
回复了 Edvin Syse 创建的主题 » 如何在Tornadofx中将MinHeight和MinWidth设置为窗口?

你走对了。根组件的首选大小将成为窗口的初始大小。您可以进一步配置窗口的最小大小,但不能在uicomponent的构造函数中进行配置,因为它是在实际窗口显示之前创建的。因为这个原因, onDock 回调是配置窗口的好地方 setWindowMinSize . 如果这是主要的应用程序窗口,一个更好的策略是重写 start 并配置 minWidth minHeigh 的属性 Stage (这是一扇窗户)。

值得注意的是,便利功能 设置窗口大小 只有在重写时才可用 船坞 在uicomponent中,因为它被定义为设置uicomponent当前阶段最小大小的快捷方式。如果你重写 开始 ,您必须直接操作属性,如下所示:

class MyApp : App(MainView::class) {
    override fun start(stage: Stage) {
        with(stage) {
            minWidth = 600.0
            minHeight = 400.0
            super.start(this)
        }
    }
}

class MainView : View() {
    override val root = borderpane {
        setPrefSize(1200.0, 720.0)
    }
}

你可以设定 isResizable = false 在舞台/窗口 开始 如果要防止调整大小,也可以使用。

6 年前
回复了 Edvin Syse 创建的主题 » TornadoFx透明视图

你犯了几个错误,导致了这一点。首先,决不能手动实例化uicomponents(view,fragment)。这样做会使他们错过重要的生命周期回调。一个重要的回调是 onDock 这是操作指定场景的最佳位置。更改这两个问题并清除某些语法将导致此代码,这成功地使背景透明:

class MyApp : App(MyView::class)

class MyView : View() {
    override val root = stackpane {
        button("open").action {
            find<NextRoundView>().openModal(stageStyle = StageStyle.TRANSPARENT, block = true)
        }
    }
}

class NextRoundView : View("Következő kör") {
    override val root = vbox {
        style {
            backgroundColor += Color.TRANSPARENT
            backgroundImage += URI.create("/common/rope-bg-500x300.png")
            backgroundRepeat += BackgroundRepeat.NO_REPEAT to BackgroundRepeat.NO_REPEAT
        }
        prefWidth = 500.0
        prefHeight = 300.0

        spacing = 20.0
        padding = insets(50, 20)
        text("A text") {
            font = Font.font(40.0)
            alignment = Pos.CENTER
        }

        button("OK") {
            font = Font.font(20.0)
            action {
                close()
            }
        }
    }

    override fun onDock() {
        currentStage?.scene?.fill = null
    }
}

以下是应用程序的屏幕截图,其中包含实现的更改:

enter image description here

6 年前
回复了 Edvin Syse 创建的主题 » TornadoFx中的ListView使用缓存窗体时显示重复项

使用时 cache 您需要为每个项指定一个唯一的ID,这样框架就知道如何为给定表单元格中当前显示的项检索缓存的UI元素。这在JavaDoc中为 隐藏物 功能。

如果项目中有ID字段,则可以使用该字段,例如:

cache(rowItem.id) { }

您甚至可以使用单元格的值,如果它是唯一的:

cache(it) { }