Я хочу загрузить новый файл FXML с некоторыми параметрами из других файлов контроллера

Я уже прочитал следующие ответы о прохождении параметров, но они мне не помогли.

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

Просьба обратиться за помощью.

MainController.java

@FXML
private void handleButtonAction(ActionEvent event) throws IOException 
{

    Context currentContext = new Context();
    URL url = getClass().getResource("ManageTemplateChild.fxml");
    FXMLLoader fxmlloader = new FXMLLoader();
    fxmlloader.setLocation(url);
    fxmlloader.setBuilderFactory(new JavaFXBuilderFactory());
    bordermanagetemp.getChildren().clear();
    bordermanagetemp.getChildren().add((Node) fxmlloader.load(url.openStream()));

    ((ManageTemplateChildController) fxmlloader.getController())
         .setContext(currentContext,Finalvaluetablerow);
}

ManageTemplateChildController.java

private Context context;
public void setContext(Context context,Object Finalvaluetablerow)
{
    this.context = context;
    o = Finalvaluetablerow;
    System.out.println("value of main" + Finalvaluetablerow + " value of child" + o);
    testlabel.setText((String) o);
}

Context.java

public class Context {
    private final static Context instance = new Context();

    public static Context getInstance() {
        return instance;
    } 
}

ManageTemplateChild.FXML

<!-- language: xml -->
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<BorderPane fx:id="bordernew" prefHeight="497.0" prefWidth="642.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="customercloudfx.ManageTemplateChildController">
  <center>
    <AnchorPane prefHeight="200.0" prefWidth="200.0">
      <children>
        <Label fx:id="testlabel" layoutX="153.0" layoutY="168.0" text="Label">
          <font>
            <Font size="100.0" />
          </font>
        </Label>
      </children>
    </AnchorPane>
  </center>
</BorderPane>

Этот код правильно открывает новый Pane, но генерирует следующее исключение. Также Label в дочерней панели не отображается.

NPE происходит из следующей строки:   bordermanagetemp.getChildren(). add ((Node) fxmlloader.load(url.openStream()));

StackTrace:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1440)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
    at javafx.event.Event.fireEvent(Event.java:171)
    at javafx.scene.Node.fireEvent(Node.java:6863)
    at javafx.scene.control.Button.fire(Button.java:179)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193)
    at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:336)
    at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
    at javafx.event.Event.fireEvent(Event.java:171)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3324)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3164)
    at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3119)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1559)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2261)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:228)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:528)
    at com.sun.glass.ui.View.notifyMouse(View.java:922)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.java:82)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1435)
    ... 44 more
Caused by: java.lang.RuntimeException: java.lang.IllegalAccessException: Class javafx.fxml.FXMLLoader$ValueElement can not access a member of class customercloudfx.ManageTemplateChildController with modifiers ""
    at javafx.fxml.FXMLLoader$ValueElement.processValue(FXMLLoader.java:661)
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:572)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2314)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2131)
    at customercloudfx.ManageTemplateController.handleButtonAction(ManageTemplateController.java:127)
    ... 49 more
Caused by: java.lang.IllegalAccessException: Class javafx.fxml.FXMLLoader$ValueElement can not access a member of class customercloudfx.ManageTemplateChildController with modifiers ""
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95)
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:261)
    at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:253)
    at java.lang.reflect.Field.doSecurityCheck(Field.java:983)
    at java.lang.reflect.Field.getFieldAccessor(Field.java:927)
    at java.lang.reflect.Field.set(Field.java:680)
    at javafx.fxml.FXMLLoader$ValueElement.processValue(FXMLLoader.java:659)
    ... 53 more

Ответ 1

Исключение указывает, что FXMLLoader не может получить доступ к вашему классу ManageTemplateChildController или к его полям/методам посредством отражения. Сделайте свой класс общедоступным. Добавьте аннотацию @FXML к закрытым полям, которые определены в файле FXML как "fx: id", или, альтернативно, сделать эти поля общедоступными без добавления аннотации @FXML.

Ответ 2

Ссылка, которую вы предоставили, содержит все. Это один из лучших ответов для тех, кто сомневается в How to pass data between Controllers и ответе на ваш вопрос!

Но в вашем случае я бы предлагал использовать Binding внутри параметров передачи! У вас может быть id в ChildController, и вы можете просто привязать его к MainController id. Так что значение id автоматически передается между контроллерами

Вы можете взглянуть на следующий URL-адрес для лучшего понимания, или если вы можете показать, как вы получаете идентификатор в MainController, возможно, я могу помочь вам с некоторым кодом!

http://docs.oracle.com/javafx/2/binding/jfxpub-binding.htm

http://www.drdobbs.com/jvm/javafx-20-binding/231903245

EDIT - загрузить контроллер из FXML

@FXML
private void handleButtonAction(ActionEvent event) throws IOException 
{
         //Instead of making a reference from the FXMLLoader, you are creating a new Object
         //ManageTemplateChildController m = new ManageTemplateChildController();
         //try using
         FXMLLoader loader = new FXMLLoader(getClass().getResource("ManageTemplateChild.fxml"));
         ManageTemplateChildController controller = 
                          loader.<ManageTemplateChildController>getController();
         //where loader is the FXMLLoader for you second FXML
         m.redirecthome(stage,Finalvaluetablerow);
}