如何访问javafx元素的子级?

时间:2018-06-27 14:21:30

标签: java javafx

我在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();
        }

1 个答案:

答案 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