Я натолкнулся на некоторые документы в интернете, что в 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();
}