如何在Workspace标头中创建搜索字段?

时间:2018-12-07 17:15:32

标签: kotlin tornadofx

根据tutorial中的建议,我在SearchView标头中添加了Workspace

class AppWorkspace : Workspace() {
    init {
        add(SearchView::class)
    }
}
class SearchView : View() {
    override val root = textfield {
        promptText = "search"
        enableWhen { searchable }
    }
}

因此,我需要一个属性以在某些视图中启用该字段:

val searchable = SimpleBooleanProperty(false)

我应该在哪里定义它以及如何访问它?

以及如何实现onSearch之类的东西?

2 个答案:

答案 0 :(得分:0)

我建议创建一个Searchable界面:

interface Searchable {
    fun onSearch(query: String)
}

在停靠时应启用搜索字段的视图将实现此接口。您可以通过创建一个可观察的布尔值来检查搜索输入的启用状态,以对此进行检查:

enableWhen(workspace.dockedComponentProperty.booleanBinding { it is Searchable })

然后,您可以确保搜索字段操作转发到当前停靠的onSearch中的Searchable函数:

action {
    (workspace.dockedComponent as Searchable).onSearch(text)
}

现在,只需在您的onSearch视图类中实现Searchable即可。您还可以通过事件清除搜索字段:

object ClearSearch : FXEvent()

在搜索字段中收听此事件:

subscribe<ClearSearch> { clear() }

现在,如果您的视图想要清除搜索字段,则可以触发此事件:

覆盖乐趣onSearch(query:String){     println(“正在搜索$ query ...”)     火(ClearSearch) }

为完整起见,这里是SearchView

class SearchView : View() {
    override val root = textfield {
        promptText = "search"
        enableWhen(workspace.dockedComponentProperty.booleanBinding { it is Searchable })
        action {
            (workspace.dockedComponent as Searchable).onSearch(text)
        }
        subscribe<ClearSearch> { clear() }
    }
}

这是一个实现Searchable的类:

class Editor1 : View("Editor 1"), Searchable {
    override val root = borderpane {
        center {
            label("Nothing here yet")
        }
    }

    override fun onSearch(query: String) {
        println("Searching for $query...")
        fire(ClearSearch)
    }
}

希望这会有所帮助:)

答案 1 :(得分:0)

按照埃德文的回答我得到:

(1920, 1080)

问题是,当我在init {}部分中放入add(SearchView :: class)并将其停靠在Searchable视图中时,“搜索”文本字段将无法启用,如果将其放入onDock函数中,它将获得启用。

但是,如果我从MyApp2打开MyWorkspace,将其关闭并再次打开,则会收到错误消息,因为再次调用了onDock并尝试再次添加(SearchView :: class)。什么解决方案可以使我从其他窗口打开MyWorkspace而没有任何麻烦?