Как получить доступ к дочерним элементам javafx? - PullRequest
0 голосов
/ 27 июня 2018

Я натолкнулся на некоторые документы в интернете, что в javafx вы можете применить контроллер только к родительскому элементу.

У меня есть приложение javafx (созданное с помощью buildbuilder, eclipse), которое имеет базовую структуру, подобную этой:

SplitPane
{
     AnchorPane
     {

     }
     AnchorPane
     {
          GridPane
          {
               Pane
               {
                     Label
                     {

                     }
               }
               Pane
               {
                     Label
                     {

                     }
               }
          }
     }
}

Я хочу изменить значения этих меток во время выполнения. Но это бросает java.lang.NullPointerException. Мое предположение, почему это происходит, заключается в том, что я применяю контроллер к разделенной панели, а метки не являются его прямыми дочерними элементами, поэтому я не могу получить к ним доступ.

Итак, вопросы: 1) Правильно ли мое предположение? Если нет, то где я не прав или что-то упустил?

2) Как получить доступ к ярлыкам?

3) Можно ли использовать контроллер для внутренних элементов (не родительских)?

Заранее спасибо, и извините, если вопрос не имеет никакого смысла, я очень новичок в javafx.

ОБНОВЛЕНИЕ: ЗДЕСЬ КОД, КОТОРЫЙ Я ИСПОЛЬЗУЮ, И ИСКЛЮЧЕНИЕ STACK TRACE:

 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 голосов
/ 27 июня 2018

Чтобы ответить на ваши вопросы:

1) Вы можете получить к ним доступ, если создаете файл FXML. См. Пункт 2.

2) Если вы хотите получить доступ к Label s во время выполнения, вы можете поместить в них атрибут в файле FXML, который вы загружаете, следующим образом: fx:id="_label1". Затем в вашем классе контроллера вы можете создать поле для этого Label, например, так: @FXML private Label _label1;

3) Нельзя добавить контроллер к другому элементу, кроме корневого элемента файла FXML. Если вы хотите иметь контроллер для определенного элемента FXML, вы должны использовать тег <fx:include source="..."/>. См. Документацию

Я настоятельно рекомендую вам прочитать руководство по FXML и JavaFX, такое как Oracle: https://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...