Почему дети нулевые? JavaFX

У меня есть небольшой код javaFX. Я хочу рисовать на холсте, но у меня есть проблема с новичком, я действительно плохо понимаю javaFX.

Это мой Main.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
Controller controller;
    @Override
    public void start(Stage primaryStage) throws Exception{
        controller= new Controller();
        controller.Pane = FXMLLoader.load(getClass().getResource("sample.fxml"));
        System.out.printf("kk"+controller.canvas.isResizable());
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(controller.Pane, controller.Pane.getPrefWidth(), controller.Pane.getPrefHeight()));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

это пример.FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.canvas.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<AnchorPane fx:id="Pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="284.0" prefWidth="484.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Canvas fx:id="canvas"  height="267.0" layoutX="13.0" layoutY="9.0" width="459.0" AnchorPane.bottomAnchor="8.0" AnchorPane.leftAnchor="13.0" AnchorPane.rightAnchor="12.0" AnchorPane.topAnchor="9.0" />
   </children>
</AnchorPane>

Для the controller.java есть только объявление холста и панели.

Мой вопрос :

  1. Панель является родителем, а холст является дочерним элементом после выполнения FXMLloader.load и т. д., панель не равна нулю, но дочерние элементы равны нулю в начале метода (снаружи, как событие кнопки, дочерние элементы не равны нулю), почему дочерние элементы равны нулю? введите здесь описание изображения
  2. Чтобы изменить размер холста, нет способа сделать это, единственное решение - расширить метод Canvas и @Override isResizable, сделать его true. Но Canvas я получаю это от FXML, если я делаю Canvas MyCanvas= new CanvasResizable(); это не работает, я не знаю почему. есть ли способ как андроид сделать например canvas=(Canvas) findbyid(FXML.id.canvas); (что-то похожее)

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

Извините, если мой вопрос уже задан другим, почему я так много искал в Google, что не хватает документации по javaFX.


person HinoHara    schedule 01.07.2014    source источник


Ответы (1)


Контроллер FXML не должен создаваться напрямую. Он будет инициализирован для вас FXMLLoader:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
        Pane root = loader.load(); // controller was initialized
        controller = loader.getController();

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, root.getPrefWidth(), root.getPrefHeight()));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

Дополнительную информацию можно найти в руководствах по Oracle: http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm#CACFEHBI

person Sergey Grinev    schedule 01.07.2014
comment
Большое спасибо за ваш ответ :D - person HinoHara; 02.07.2014