尝试使用自定义FXML组件的JavaFX空指针

时间:2018-05-19 11:53:02

标签: javafx controller fxml

我正在尝试编写一个自定义图形组件,我可以重复使用它来在应用程序中的多个选项卡上绘制图形。

图表的单个实例由一个FXML文件组成,该文件由一个AnchorPane和5个Canvas组成,对于我想要显示的每个系列,它们都在彼此的顶部。每个Canvas都分配了一个fx:id。 然后我有一个与此相关的graphFXMLController.java文件,每个画布都有一个GraphicsContext,当运行一个函数我可以在每个画布上绘制。

在我的主应用程序控制器文件中,我使用:

声明组件
@FXML
public GraphFXMLController spectrumgraph; 

在我的主应用程序FXML文件中,我导入了graphFXMLController文件:

<?import measuremefx.GraphFXMLController?>

然后我用:

声明我的组件
<GraphFXMLController id="AnchorPane" fx:id="spectrumgraph" layoutX="-23.0" layoutY="314.0" prefHeight="357.0" prefWidth="601.0" /> 

我的GraphFXMLController文件是:

public class GraphFXMLController extends AnchorPane implements Initializable  {

@FXML 
public Canvas backgroundCanvas;

@FXML
public Canvas series1Canvas;

@FXML
public Canvas series2Canvas;

@FXML
public Canvas series3Canvas;

@FXML
public Canvas series4Canvas;

@FXML
public Canvas savedSeriesCanvas;

public GraphFXMLController(){
    System.out.println("Graph Initialised");
    GraphicsContext backgroundGC = backgroundCanvas.getGraphicsContext2D();
}

我的想法是,然后我可以调用图形上下文然后绘制我的系列。但是,目前当我尝试运行应用程序时,我可以看到主页面何时加载,它会在我收到System out消息时调用GraphFXMLController加载,但是我的GraphicsContext声明上出现了空指针错误。似乎有一个指向backgroundCanvas的空指针。我不明白,因为它应该在@FXML语句中初始化。

下面是graphFXML文件,显示了backgroundCanvas应该在那里。

<?import javafx.scene.canvas.Canvas?>
<?import javafx.scene.layout.AnchorPane?>

<fx:root id="AnchorPane" minHeight="200.0" minWidth="300.0"     prefHeight="300.0" prefWidth="600.0" type="AnchorPane"     xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1"     fx:controller="measuremefx.GraphFXMLController">
   <children>
  <Canvas fx:id="backgroundCanvas" height="300.0" width="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  <Canvas fx:id="series1Canvas" height="300.0" width="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  <Canvas fx:id="series2Canvas" height="300.0" width="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  <Canvas fx:id="series3Canvas" height="300.0" layoutX="7.0" width="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  <Canvas fx:id="series4Canvas" height="300.0" width="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  <Canvas fx:id="savedSeriesCanvas" height="300.0" layoutY="-1.0" width="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  </children>
</fx:root>

我曾尝试在backgroundCanvas语句之后将GraphicsContext声明移动到@FXML语句中,但它仍然返回空指针。我加载错误吗?

非常感谢任何帮助。我实现了这种特定类型的图形的几个实例,都具有对数轴和非常快的20Hz刷新率,并且无法使用此代码的实例,这个项目会很快变得混乱。

0 个答案:

没有答案