我在Internet上遇到了一些文档,在javafx中,您可以将控制器仅应用于父元素。
我有一个Javafx应用程序(使用scenebuilder,eclipse构建),其基本结构如下:
SplitPane
{
AnchorPane
{
}
AnchorPane
{
GridPane
{
Pane
{
Label
{
}
}
Pane
{
Label
{
}
}
}
}
}
我想在运行时更改那些标签的值。但是它抛出了java.lang.NullPointerException
。我之所以这么想,是因为我将控制器应用于拆分窗格,并且标签不是其直接子级,因此我无法访问它们。
所以问题是: 1)我的假设正确吗?如果不是我错了或遗漏了什么?
2)如何访问标签?
3)我可以对内部元素(不是父元素)使用控制器吗?
预先感谢您,如果问题没有任何意义,对不起,我对javafx还是很陌生。
更新:这里是我正在使用的代码和异常堆栈跟踪:
public class Controller implements Initializable
{
@FXML
private SplitPane splitPane;
@FXML
private AnchorPane anchorPane1;
@FXML
private AnchorPane anchorPane2;
@FXML
private GridPane gridPane;
@FXML
private static Label z1;
@FXML
private static Label z2;
private HashMap<Integer,Label> zoneLabelNames = new HashMap<Integer,Label>();
public Controller()
{
// I have around 20 such labels which's value i'm setting using a loop. For now I've writter two only.
zoneLabelNames.put(0, z1);
zoneLabelNames.put(1, z2);
new Thread(() -> {
while(true)
{
try
{
//some logic to generate new values which will update labels
Platform.runLater(() -> {
//here I'm actually setting values in loop, for now I wrote only two labels.
for(int i =0;i<2;i++)
{
zoneLabelNames.get(i).setText("newly generated value"); // nullPointerException at this line
}
});
}
catch(Exception e)
{
e.printStackTrace();
}
}
}).start();
}
答案 0 :(得分:4)
要回答您的问题:
1)如果要创建FXML文件,则可以访问它们。参见第2点。
2)如果要在运行时访问Label
,则可以像这样fx:id="_label1"
一样在正在加载的FXML文件中放置一个属性:然后,在控制器类中,您可以像这样Label
创建一个字段:@FXML private Label _label1;
3)您不能将控制器添加到FXML文件根元素以外的其他元素。如果要在FXML的特定元素上使用控制器,则必须使用<fx:include source="..."/>
标签。 See documentation
我强烈建议您通读有关FXML和JavaFX的教程,例如Oracle的教程:https://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm