2017-12-06 1 views
0

나는 TornadoFX 라이브러리로 Kotlin에서 일하고 있습니다. 현재보기에 유용한 도구를 보여주는 툴바가 있다고 가정 해보십시오. 그래서 우리는 도구 모음 옆에 어떤보기의 컨트롤러 인 subController 속성을 가진 MainController를 가지고 있습니다. 따라서 subController가 변경되면 뷰가 업데이트되어야합니다. 또한 subController의 속성 (예 : selectedTool, tools)이 변경되면 툴바가 적절히 업데이트되어야합니다. 일시적으로 도구 모음이 업데이트되지 않습니다.변경 컨트롤러 속성에 대한보기 바인딩

class ToolBar : View("Tool bar") { 
    private val controller: MainController by inject() 
    override val root = vbox { 
     tilepane { 
      for (tool in controller.subController.tools) { 
       button(tool.name, group).action { 
        controller.subController.changeTool(tool) // changes selected tool 
       } 
      } 
     } 
     this += controller.subController.selectedTool.options 
    } 
} 

추가 정보 : subController.tools는 ArrayList를하고 subController.selectedTool는 도구이다.

이제 내 질문은 TornadoFX에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

답변

1

몇 가지 옵션이 있습니다. Parent은 관찰 가능한 항목 목록을 허용하는 bindChildren이라는 기능과 각 항목을 노드로 변환하는 기능을 지원합니다.

tilepane { controller.subController.tools.onChange { children.clear : 당신이 더 많은 제어를해야하는 경우가 수동으로이 작업을 수행 할 수 있습니다

tilepane { 
    bindChildren(controller.subController.tools) { tool -> 
     Button(tool.name) ... 
    } 
} 

: 당신은 툴바에 버튼을 만들려면이 사용할 수 있습니다() // 당신이 일에 주입 이는 ToolsModel 있어야한다, 대신 도구에 도착 subController에 액세스 할 컨트롤러를 주입, } }

그러나 귀하의 예제처럼, 여기에 새로운 버튼을 만들 현재 범위. 도구 모델은 도구 목록과 선택한 도구를 가질 수 있으며이를 필요로하는 모든보기 및 제어기에 삽입 할 수 있습니다. selectedTool은 Tool이지만 Tool이 무엇인지 보여주는 것은 아니지만 코드에서 판단 할 때 Tool.options는 Node 하위 클래스 (?)처럼 보입니다.

동일한 기술을 사용하여 tool.options 요소를 추가/제거 할 수 있으며 변경시 도구를 식별 할 수 있도록 스택 페인이나 다른 레이아웃 컨테이너로 래핑 할 수도 있습니다 (또는 스택 판의 모든 하위를 간단히 제거 할 수 있음). 동일한 기술을 사용합니다.

+0

도구는 options 속성이 Pane 인 사용자 지정 클래스입니다. 또한 subController 속성이 다시 할당되면 도구 모음이 업데이트됩니까? –

+0

@SimonMarynissen 나는 TornadoFX에 익숙하지 않다. 그러나 이것은 불가능할 것이다. 자식들을 업데이트 할지라도'tools'리스트 만 전달하고,'subController'를 _old_'tools' 목록은 변경되지 않습니다. – Moira

+0

subController에 observable을 추가하면이 문제를 해결할 수 있습니까? –

관련 문제