Как сделать поле поиска в заголовке Workspace? - PullRequest
0 голосов
/ 07 декабря 2018

Как предложено в учебнике , я добавил заголовок 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 голосов
/ 28 декабря 2018

После ответа Эдвина я получаю:

class MyApp: App(MyWorkspace::class)

class MyApp2: App(View3::class){
    init{
        FX.defaultWorkspace = MyWorkspace::class
    }
}


class MyWorkspace: Workspace("My Workspace") {
    override fun onDock() {
        add(SearchView::class) //With this search view gets enable
    }
    init {
        //add(SearchView::class)   //With this search view doesn't get enable
        root.setPrefSize(800.0, 600.0)
        menubar {
            menu("Windows"){
                item("View1").action{dock<View1>()}
                item("View2").action{dock<View2>()}
            }
        }
    }
}

interface Searchable {
    fun onSearch(consulta: String)
}

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() }
    }
}

object ClearSearch : FXEvent()

class View1 : View(), Searchable{
    override val root = label("This is View 1")
    override fun onSearch(consulta: String) {
        println("I'm searching")
    }
}

class View2 : View(){
    override val root = label("This is View 2")
}

class View3 : View(){
    override val root = button("Open Workspace"){
        action{
            workspace.openWindow()
        }

    }
}

Дело в том, что когда я помещаю add (SearchView :: class) в раздел init {} и закрепляю представление с возможностью поиска, текстовое поле поиска не получаетсявключите, если положить его в функцию onDock, он получит enable.

Но если я открою MyWorkspace из MyApp2, закрою его и открою снова, я получу ошибку, так как onDock вызывается снова и пытается добавить (SearchView :: class) еще раз.Какое здесь решение, чтобы я мог без проблем открыть MyWorkspace из какого-то другого окна?

0 голосов
/ 08 декабря 2018

Я бы предложил создать интерфейс с возможностью поиска:

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)
    }
}

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...