もちろん、簡単な例を作成することに直接飛び込みます。
public class Main extends Application {
URL bla = getClass().getResource("/sample.fxml");
@Override
public void start(Stage primaryStage) throws Exception{
//If you get weird errors: http://zenjava.com/javafx/maven/fix-classpath.html
//but not actually my issue. Example displays fine in intellij.
try {
FXMLLoader loader = new FXMLLoader(bla);
Parent root = loader.load(bla);
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root));
primaryStage.show();
Controller controller = loader.<Controller>getController() ;
assert(controller != null);
controller.getLabel().setText("Kaboom!");
} catch (Exception e) {
// Exception gets thrown if the fxml file could not be loaded
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
https://forums.oracle.com/thread/2317621を読みまし たが、上部のアンカーペインが fxml でコントローラーを指す必要があることを知っています。
<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns:fx="http://javafx.com/fxml" fx:controller="mypackage.Controller">
<children>
正常に表示されますが、コントローラーがないため、アサーションがキャッチされます!
また、initialize()
実際に実行されます。つまり、次のコントローラーが作成されます。
public class Controller {
@FXML
private Label label ;
public Label getLabel()
{
return label ;
}
@FXML
public void initialize()
{
System.out.println("Swear a lot!");
System.out.println(label);
}
}
これを見ているFX開発者への注意:
クラスを指す xml ファイルに弱結合文字列を含める場合、探しているものが見つからない場合、.load() が意味のある実行時例外をスローすることを本当に期待しています。null を返す言い訳はありません... 理想的には、GWT ウィジェット チームからページを取得し、プログラムが実際に開始される前にプリコンパイラが失敗するようにするか、人気のある IDE のプラグインを実行するのが最善です。
さらに、JavaFXのソースコードをJavaFX用に起動して実行する(mavenに入れる)のは本当に簡単にする必要があります。そうすれば、自動的にダウンロードでき、問題が何であるかを自分で解決できます。あまりにもハード。
私が間違っている単純なことがあると確信していますが、ツールは私をこれから救ってくれるはずです。