2016-03-19 3 views
0

Я работаю над приложением карты в JavaFX. Идея состоит в том, что пользователь должен иметь возможность обновлять информацию о местах на карте. Карта представляет собой статическое изображение с невидимыми панелями, расположенными над ним. У меня есть кнопка в форме, которая откроет представление карты как модальную с выделенными выделенными областями. Когда я выбираю область, идентификатор этой области хранится в другом классе для доступа, а модальный закрывается, но мне действительно хотелось бы вернуть значение в контроллер формы и вызвать событие для изменения метки на форме.Получить значения из модального JavaFX

вызова метода для отображения карты (содержащийся внутри контроллера формы):

@FXML 
private void selectArea() 
{ 
    Main.viewLoader.displayRootSelection(); 
} 

Мой вид погрузчик:

public void displayRootSelection(){ 
    Stage window = new Stage(); 
    currentWindow = window; 
    Main.setRootInSelection(true); 
    try { 
     BorderPane root = FXMLLoader.load(getClass().getResource("../views/root/Root.fxml")); 
     window.setResizable(false); 
     window.initModality(Modality.APPLICATION_MODAL); 
     window.setTitle("WIT Map"); 
     Scene scene = new Scene(root, 1000, 600); 
     Main.setScene(scene); 
     window.setScene(scene); 
     window.showAndWait(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

И обработчик события на панели на карте:

@FXML 
private void panelClicked(Event e) 
{ 
    if (Main.isRootInSelection()){ 
     String tempId = AreaManagement.findArea((Node)e.getSource()); 
     AreaManagement.setTempAreaId(tempId); 
     viewLoader.getCurrentWindow().close(); 
    } 
    System.out.println(AreaManagement.findArea((Node) e.getSource())); 
} 

То, что я пытаюсь сделать, это получить tempId из обработчика событий в контроллере для сопоставить с контроллером формы, а также вызвать событие в форме. Любая помощь будет оценена по достоинству.

ответ

0

Моего понимания вашего вопроса, поправьте меня, если я ошибаюсь:

Открывает модальное окно, с помощью window.showAndWait(), то после закрытия окна вам нужно, чтобы получить выбранный результат из этого окна модального.

В предположении, что AreaManagement доступен в вашем displayRootSelection() Метод, следующее решение должно решить вашу проблему.

Документация для window.showAndWait():

показывает эту сцену и ждет, чтобы он был скрыт (закрыт), прежде чем вернуться к абоненту.

Сразу после вызова метода вы можете вызвать любую дальнейшую обработку и спокойно принять, что модальное окно закрыто. См:

public void displayRootSelection(Consumer<String> callback){//EDIT, usage see below 
    Stage window = new Stage(); 
    currentWindow = window; 
    Main.setRootInSelection(true); 
    try { 
     BorderPane root = ...; 
     /*...*/ 
     window.showAndWait(); 
     // When the code reaches this position, your modal window is closed 
     String tempId = AreaManagement.getTempAreaId(); 
     // You can call just about anything here 
     callback.accept(tempId); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

EDIT: получить этот вызов метода обратно к контроллеру:

В контроллере:

@FXML 
private void selectArea() 
{ 
    Main.viewLoader.displayRootSelection((selectedId) -> { 
     // Do something with the ID.. 
    }); 
} 

В качестве альтернативы, вы можете создать анонимный класс вместо того, чтобы использовать лямбда Вот.

+0

Это почти то, что мне нужно, за исключением того, что я все еще не могу понять, как вызвать событие на моем контроллере, поскольку я не могу использовать статические элементы или методы внутри контроллера. То, что мне действительно нужно сделать, это вызвать статический метод на моем контроллере изнутри ViewLoader, который изменит статическую метку, введенную из FXML. – JavaTheNutt

+0

А, я вижу. См. Мой отредактированный ответ, который должен дать вам то, что вам нужно. Если вы настаиваете на использовании другого подхода, кому-то придется вторгаться - это самый простой способ, о котором я могу думать. – founderio

Смежные вопросы