2016-09-17 3 views
0

Извините, что я новичок в JavaFX. Моя настройка: У меня есть один основной графический интерфейс FXML, который отображается все время. Внутри этого основного графического интерфейса я загрузил еще один FXML в AnchorPane.Как я могу ссылаться на тот же элемент FXML из экземпляра того же класса

Второй FXML загружается в этом AnchorPane (который является в основном GUI), первоначально с использованием:

@FXML 
private AnchorPane rootSetPane; 

я затем использовать rootSetPane оттуда. Это AnchorPane, которая находится внутри одного и того же основного графического интерфейса.

<AnchorPane fx:id="rootSetPane" layoutX="228.0" prefHeight="710.0" prefWidth="887.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="228.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> 

Инициализировать главный контроллер (основной графический интерфейс отображается все время)

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    AnchorPane paneHome; 
    try { 
     paneHome = FXMLLoader.load(getClass().getResource("HomePage.fxml")); 
     rootSetPane.getChildren().setAll(paneHome);   
    } catch (IOException ex) { 
     Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Пример рабочего метода в этом основном классе (это называется с помощью кнопки в одной и той же основной FXML):

@FXML 
private void foodFinder(ActionEvent event) throws IOException {  
    AnchorPane paneFoodFinder = FXMLLoader.load(getClass().getResource("ScreenFoodFinder.fxml")); 

    rootSetPane.getChildren().setAll(paneFoodFinder);  
} 

примером метода, который не работает (это называется использованием объекта):

public void setPanel() throws IOException { 
    AnchorPane newPane = FXMLLoader.load(getClass().getResource("NewPane.fxml")); 
rootSetPane.getChildren().setAll(newPane); 
} 

Я установил эту вторую панель несколько раз во время программы, используя кнопки в главном графическом интерфейсе (это работает). Проблема возникает при попытке установить эту панель вне класса основного контроллера. Я не могу использовать экземпляр класса Main и вызвать метод для доступа к rootSetPane (и я не могу сделать статический файл rootSetPane). Я получаю NullPointerException. Я уверен, что это любительская ошибка. Есть ли способ, которым я могу изменить этот rootSetPane, используя метод, подобный приведенному выше.

Или мне нужно сделать другие классы для управления экранами. Было бы оценено самое простое (даже грязное) решение.
Это также сработает, если я смогу запустить кнопку в главном графическом интерфейсе, но это приводит к той же проблеме (NullPointerException). Я чувствую, что не могу ссылаться на элементы, используя объект класса, и я также не могу сделать эти элементы статичными.

ответ

0

Вы можете сделать класс, который расширяет AnchorPane .То класс будет контроллер fxml.So вы можете создать экземпляр этого нравится:

SpecialAnchorClass anchor = new SpecialAnchorClass(); 

Упоминание, что в SceneBuilder вы должны проверить: enter image description here

So your SpecialAnchorClass will be like this:

public class SpecialAnchorClass extends AnchorPane implements Initializable{ 

    //[email protected] nodes 

    /** 
    * Constructor 
    */ 
    public SpecialAnchorClass(){ 
     //FXMLLOADER 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("..path to fxml file")); 
     loader.setController(this); 
     loader.setRoot(this); 

     try { 
      loader.load(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 


      //when this method is called every fxml component has been initialized 
    } 

} 
+0

Когда я создам объект этого класса в последовательности моей программы? – lolftw

+0

@lolftw Вы можете создать его в качестве члена класса Main или создать его, когда захотите, и сделать его статическим окончательным. – GOXR3PLUS

+0

Как я уже говорил, я совершенно новичок в этом, и я думаю, что я реализую это неправильно. Я получаю эту ошибку: 'javafx.fxml.LoadException: Root не был установлен. Используйте метод setRoot() перед загрузкой. ' – lolftw

0

Проверьте, если getClass().getResource("NewPane.fxml") указывает на правильный файл.

+0

имя файла правильно. но с «rootSetPane» происходит ошибка (такая же ошибка, как указано выше). Эта строка не работает: «rootSetPane.getChildren()». – lolftw

+0

Как вы инициализируете 'rootSetPane'? –

+0

сделал некоторые изменения – lolftw