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 の場合、チェックでこの事実が得られ、アクセスできない場合、アプリケーションはコンパイルに失敗しますが、得られるものは異なります。