次の行を含むFXMLファイルのコンポーネントがあります。
<AnchorPane xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="DataTableController">
コントローラにfxmlをロードしようとしています。
public DataTableController() throws IOException {
FXMLLoader.load(getClass().getResource("DataTable.fxml"));
}
アプリケーションを拡張するクラスはありません。別のアプリケーション(カスタムシーンビルダー)によって起動されるウィンドウが既にあるため、メインメソッドを使用する必要はありません。そのため、カスタムビューコンポーネントのウィンドウにAnchorPaneを表示したいだけです。 AnchorPaneをfx:rootに変更すると、FXMLをロードしてrootを設定してcontrollerを設定することができるため、fx:rootを使用しないとFXMLをロードする方法がわからないという問題があります。 fxmlファイルの内容を自分のウィンドウに表示しますが、コントローラの設定が重複しているため、コントローラをfxmlに設定しないと、コントローラをfxmlファイルに設定できないという問題があります。私はcontrolerを設定する必要があるボタンを持っているので、私はエラーが出ます。
それで、私は何をしますか? また、いつfx:rootを使用するのですか。 (私はそれをグーグルして他のSOエントリーをチェックしたが、それでも私の考えでは明確ではない)。私の問題に対する提案やfx:rootについてのいくつかの例を使った明確な説明があれば幸いです。
私はJavaFXとSOにとても不慣れなので、自分の問題をうまく説明できない場合は自分自身を明確にするように親切にお願いします。
編集:@fabianが示唆したように、私が実際に以前試したJavaクラスを変更しました。 そして私が上で述べたようにこのエラーを得ます。
回答:
回答№1は0fxmlファイルでコントローラを設定しないと、コントローラを設定する必要があるボタンがあるのでエラーになります
違います。のコントローラインスタンスを設定している限り、 FXMLLoader
fxmlをロードする前に、問題になるべきではありません。
これを実装するための推奨方法は次のとおりです。
public class DataTableController extends AnchorPane {
public DataTableController() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("DataTable.fxml"));
// set this instance as root & controller
loader.setRoot(this);
loader.setController(this);
loader.load();
}
...
}
<fx:root xmlns="http://javafx.com/javafx/9.0.1"
xmlns:fx="http://javafx.com/fxml/1"
type="javafx.scene.layout.AnchorPane">
...
</fx:root>