0

FXML 定義のフォーム コントローラーで動的に作成されたボタンのイベント ハンドラーを記述しようとしていますが、問題なく動作しているように見えますが、別の要素にアクセスしようとすると失敗します。

たとえば、次のコードは問題なく動作します。

import java.util
import java.net.URL
import javafx.{scene => jfxs, fxml => jfxf}
import javafx.event.{EventHandler, ActionEvent}
import scalafx.Includes._

class  MainFormFxmlController extends jfxf.Initializable{
  @jfxf.FXML
  private var anchorPane: jfxs.layout.AnchorPane = _

  @jfxf.FXML
  private var slider: jfxs.control.Slider = _

  def initialize(url: URL, rb: util.ResourceBundle) {
    // the slider variable becomes null at this point if I observe it in the button event handler below and is not null id I don't
    slider.valueProperty.addListener{ (o: javafx.beans.value.ObservableValue[_ <: Number], oldVal: Number, newVal: Number) =>
      // ...
    }

    //...

    val button = new jfxs.control.Button("Button")

    jfxs.layout.AnchorPane.setRightAnchor(button, 63.0)

    jfxs.layout.AnchorPane.setTopAnchor(button, 14.0)

    anchorPane.getChildren.add(button)

   button.setOnAction(new EventHandler[ActionEvent]() {
      @Override
      def handle(event: ActionEvent) {
        println("123") // trying to access the slider variable here makes the whole app fail on load
      }
    })
  }
}

ただし、関数の先頭で NullPointerException をスローしてアプリケーションを失敗させるには、に置き換えるだけで十分println("123")です。if(slider != null) println("123")initialize

私が到達しようとしているのは、ボタンを押したときにスライダーの値を調整することです (この特定のボタンを動的に作成し、フォームの残りの部分を FXML からロードします)。スライダー変数で行われた単なるヌルチェックが失敗の原因であり、必ずしもその値の調整ではないことがわかりました。

スライダー変数が null の場合、チェックでこの事実が得られ、アクセスできない場合、アプリケーションはコンパイルに失敗しますが、得られるものは異なります。

4

0 に答える 0