Невозможно переместить TextFlow внутри новой сцены - PullRequest
3 голосов
/ 09 марта 2019

В моем проекте ScalaFX я хочу создать отдельную страницу справки для пользователя, в которой он может выбрать тему, из-за которой рядом с интерактивными темами появятся инструкции.

Проблема в том, что когда я создаю новую сцену для страницы справки, независимо от того, что я делаю, я не могу переместить TextFlow вокруг. Он остается на том же месте в верхней части ListView. См. Изображение для справки.

 helpMenu.onAction = (ae: ActionEvent) => {
    val helpStage = new Stage()
    helpStage.setTitle("A wild help stage appears!")
    val helpScene = new Scene(scene.width.get * 0.6, scene.height.get * 0.8) {
      val listView        = new ListView(List.tabulate(3) { n => "Option " + (n + 1) })
      val text1           = new Text("This is fine\n*zips coffee*\nThis is all fine.")
      val textFlow        = new TextFlow(text1)
      /*
       * Nothing below changes where the text appears in the new scene.
       */
      textFlow.layoutX  <== listView.width.get
      textFlow.alignmentInParent_=(Pos.TOP_RIGHT)
      textFlow.alignmentInParent_=(Pos.BASELINE_CENTER)
      text1.alignmentInParent_=(Pos.BASELINE_CENTER)

      listView.prefHeight <== scene.height.get * 0.4
      content.addAll(listView, textFlow)

    }
    helpStage.setScene(helpScene)
    helpStage.show()
    helpScene.listView.onMouseClicked = (le: MouseEvent) => {
      val item = helpScene.listView.selectionModel.apply.getSelectedItem
    }
  }

Что я хочу знать, так это как я могу ориентировать текст рядом со списком? Цель состоит в том, чтобы сделать инструкции появиться там. Мой план состоял в том, чтобы использовать

helpScene.listView.onMouseClicked = (le: MouseEvent) => { val item = helpScene.listView.selectionModel.apply.getSelectedItem }

для этой цели, поскольку мы можем легко определить, что было нажато внутри списка.

enter image description here

1 Ответ

2 голосов
/ 09 марта 2019

Думаю, проблема в том, что вам нужно добавить элементы ListView и TextFlow в контейнер, который будет контролировать их расположение.В приведенном ниже коде я использую HBox для этой цели, что ставит эти два рядом друг с другом.(В пакете scalafx.scene.layout есть и другие параметры, такие как VBox, BorderPane и т. Д. Этот учебник для более старой версии JavaFX 2 может помочь вамлучшее понимание темы.)

После этого мне немного неясно, чего вы пытаетесь достичь, но я думаю, что вы пытаетесь сделать, это показать другой текст в TextFlow в зависимости от того, какой элемент в ListView выбран.Если это так, то следующий пример решает эту проблему, используя изменение выделения для запуска изменения содержимого TextFlow.(Если это не то, что вы имели в виду, можете ли вы уточнить ваши требования?)

Кроме того, я упростил часть вашего кода для использования свойств ScalaFX (какв отличие от JavaFX геттеров и сеттеров ).

onAction = (ae: ActionEvent) =>  {
  val helpStage = new Stage() {

    // Make room for the list view and the text flow.
    width = 400

    // Set the help text to the default.
    val defaultText = "Please make\na selection"
    val helpText = new Text(defaultText)

    // Help for each option in the list view. If a key doesn't match, then the default
    // text is displayed.
    val optionText = Map(
      "Option 1" -> "This is\nsome help for\nOption 1",
      "Option 2" -> "And this is\nsome help for\nOption 2",
      "Option 3" -> "Finally, this is\nsome help for\nOption 3",
    ).withDefaultValue(defaultText)

    // Title the stage and set the scene...
    title = "A wild help stage appears!"
    scene = new Scene {

      val listView = new ListView(List.tabulate(3) { n => "Option " + (n + 1) }) {

        // Change the help text when the selection changes.
        selectionModel().selectedItem.onChange {(_, _, selected) =>
          helpText.text = optionText(selected);
        }
      }

      // Add the help text to the text flow.
      val textFlow = new TextFlow(helpText)

      // Put list view and text flow elements side-by-side.
      content = new HBox(listView, textFlow)
    }
  }
  helpStage.show()
}
...