Я бы предложил создать интерфейс с возможностью поиска:
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() }
Теперь ваши представления могут запускать это событие, если они хотят очиститьполе поиска:
переопределить fun onSearch (query: String) {println ("Searching $ query ...") fire (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)
}
}
Надеюсь, это поможет:)