我正在尝试编写一个自定义图形组件,我可以重复使用它来在应用程序中的多个选项卡上绘制图形。
图表的单个实例由一个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刷新率,并且无法使用此代码的实例,这个项目会很快变得混乱。