Передача параметров JavaFX FXML


Answers

Класс javafx.scene.Node имеет пару методов setUserData (Object) и Object getUserData ()

Что вы можете использовать, чтобы добавить свою информацию в узел.

Таким образом, вы можете вызвать page.setUserData (info);

Контроллер может проверить, установлена ​​ли информация. Кроме того, вы можете использовать ObjectProperty для пересылки данных в обратном направлении, если это необходимо.

Обратите внимание на документацию здесь: http://docs.oracle.com/javafx/2/api/javafx/fxml/doc-files/introduction_to_fxml.html Перед фразой «В первой версии handleButtonAction () помечен как @FXML чтобы разрешить разметку, определенную в документе контроллера, во втором примере, поле кнопки аннотируется, чтобы позволить загрузчику установить его значение. Метод initialize () аналогично аннотируется ».

Таким образом, вам нужно связать контроллер с узлом и установить пользовательские данные для узла.

Question

Как передать параметры во вторичное окно в javafx? Есть ли способ связаться с соответствующим контроллером?

Например: пользователь выбирает клиента из TableView и открывается новое окно с указанием информации клиента.

Stage newStage = new Stage();
try 
{
    AnchorPane page = (AnchorPane) FXMLLoader.load(HectorGestion.class.getResource(fxmlResource));
    Scene scene = new Scene(page);
    newStage.setScene(scene);
    newStage.setTitle(windowTitle);
    newStage.setResizable(isResizable);
    if(showRightAway) 
    {
        newStage.show();
    }
}

newStage будет новым окном. Проблема в том, что я не могу найти способ сообщить контроллеру, где искать информацию о клиенте (передавая параметр id в качестве параметра).

Есть идеи?




Вот пример использования контроллера, введенного Guice.

/**
 * Loads a FXML file and injects its controller from the given Guice {@code Provider}
 */
public abstract class GuiceFxmlLoader {

   public GuiceFxmlLoader(Stage stage, Provider<?> provider) {
      mStage = Objects.requireNonNull(stage);
      mProvider = Objects.requireNonNull(provider);
   }

   /**
    * @return the FXML file name
    */
   public abstract String getFileName();

   /**
    * Load FXML, set its controller with given {@code Provider}, and add it to {@code Stage}.
    */
   public void loadView() {
      try {
         FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource(getFileName()));
         loader.setControllerFactory(p -> mProvider.get());
         Node view = loader.load();
         setViewInStage(view);
      }
      catch (IOException ex) {
         LOGGER.error("Failed to load FXML: " + getFileName(), ex);
      }
   }

   private void setViewInStage(Node view) {
      BorderPane pane = (BorderPane)mStage.getScene().getRoot();
      pane.setCenter(view);
   }

   private static final Logger LOGGER = Logger.getLogger(GuiceFxmlLoader.class);

   private final Stage mStage;
   private final Provider<?> mProvider;
}

Вот конкретная реализация загрузчика:

public class ConcreteViewLoader extends GuiceFxmlLoader {

   @Inject
   public ConcreteViewLoader(Stage stage, Provider<MyController> provider) {
      super(stage, provider);
   }

   @Override
   public String getFileName() {
      return "my_view.fxml";
   }
}

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




Это работает ..

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

Первый контроллер

try {
                                Stage st = new Stage();
                                 FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/inty360/free/form/MainOnline.fxml"));

                                Parent sceneMain = loader.load();

                                MainOnlineController controller = loader.<MainOnlineController>getController();
                                controller.initVariable(99L);

                                Scene scene = new Scene(sceneMain);
                                st.setScene(scene);
                                st.setMaximized(true);
                                st.setTitle("My App");
                                st.show();
                            } catch (IOException ex) {
                                Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
                            }

Другой контроллер

public void initVariable(Long id_usuario){
        this.id_usuario = id_usuario;
        label_usuario_nombre.setText(id_usuario.toString());

    }



Related