无法从fxml画布获取图形上下文

时间:2015-01-01 18:04:24

标签: canvas javafx

我创建了一个基本的FXML布局,并排了一个网格和画布。我可以访问canvas对象(drawArea),但在调用getGraphicsContext后,我的gt变量始终为null。

控制器类

public class controls {
    private GraphicsContext gc;
    @FXML private Canvas drawArea;

public void start() {
    gc = drawArea.getGraphicsContext2D();
}


@FXML protected void Step(ActionEvent event) {
    //TODO code to update positions of boids.
    System.out.print("Step triggered ");


    gc.fillOval(100, 100, 10, 10);
}

}

FXML显示

<SplitPane dividerPositions="0.29797979797979796" 
maxHeight="-Infinity" maxWidth="-Infinity" 
minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" 
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="controller.controls" >
  <items>

    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
         <children>
            <GridPane hgap="15.0" prefHeight="90.0" prefWidth="175.0">
              <columnConstraints>
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
              </columnConstraints>


<rowConstraints>
            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          </rowConstraints>
           <children>
              <Label text="Flock Size:" />
              <Button id="buttonStart" mnemonicParsing="false" text="Start" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="2" />
              <Button id="buttonStep" mnemonicParsing="false" onAction="#flockStep" text="Step" GridPane.halignment="CENTER" GridPane.rowIndex="1" />
              <Button mnemonicParsing="false" text="-" GridPane.columnIndex="1" GridPane.halignment="LEFT" />
              <Button mnemonicParsing="false" text="+" GridPane.columnIndex="1" GridPane.halignment="RIGHT" />
              <Button id="buttonStop" mnemonicParsing="false" text="Stop" GridPane.halignment="CENTER" GridPane.rowIndex="2" />
           </children>
        </GridPane>
     </children></AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
     <children>
        <Canvas fx:id="drawArea" height="200.0" width="200.0" />
     </children></AnchorPane>

1 个答案:

答案 0 :(得分:2)

在控制器中,永远不会调用start()。如果您定义initialize()方法(或只是将start()更改为initialize()),则FXMLLoader会自动调用该方法。