我想从其他控制器文件加载一些参数的新FXML文件 [英] I want to load new FXML file with some parameters from the other Controller Files

查看:591
本文介绍了我想从其他控制器文件加载一些参数的新FXML文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经阅读了关于传递参数的下一个答案,但他们没有帮助我。





下面是我从事件处理程序打开新的FXML视图失败的参数。



请查找帮助。



MainController.java

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

上下文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
$ b

 私有上下文上下文; 
public void setContext(Context context,Object Finalvaluetablerow)
{
this.context = context;
o = Finalvaluetablerow;
System.out.println(main+ Finalvaluetablerow +child的值+ o);
testlabel.setText((String)o);
}

Context.java
$ b

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

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

ManageTemplateChild.FXML / p>

 <! -  language:xml  - > 
<?xml version =1.0encoding =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 =bordernewprefHeight =497.0prefWidth =642.0xmlns:fx =http://javafx.com/fxml/1xmlns =http: //javafx.com/javafx/2.2fx:controller =customercloudfx.ManageTemplateChildController>
< center>
< AnchorPane prefHeight =200.0prefWidth =200.0>
< children>
< Label fx:id =testlabellayoutX =153.0layoutY =168.0text =Label>
< font>
< Font size =100.0/>
< / font>
< / Label>
< / children>
< / AnchorPane>
< / center>
< / BorderPane>

此代码正确地打开了新的 Pane 下一个异常。

NPE来自下一行:
bordermanagetemp。

getChildren()。add((Node)fxmlloader.load(url.openStream()));



StackTrace: b
$ b

 线程JavaFX应用程序线程中的异常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)
在com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
在javafx.event.Event.fireEvent( Event.java:171)
在javafx.scene.Node.fireEvent(Node.java:6863)
在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 )
在javafx.event.Event.fireEvent(Event.java:171)
在javafx.scene.Scene $ MouseHandler.process(Scene.java:3324)
在javafx.scene。 Scene $ MouseHandler.process(Scene.java:3164)
在javafx.scene.Scene $ MouseHandler.access $ 1900(Scene.java:3119)
在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方法)
at com.sun.glass.ui.gtk.GtkApplication $ 3 $ 1.run(GtkApplication.java:82)
在java .lang.Thread.run(Thread.java:722)
导致:java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法)
at sun。 (java.lang.reflect.Method.invoke)中的
方法。java.lang.reflect.Method.invoke(Method.java:java.lang.reflect.Method.invoke) 601)
at javafx.fxml.FXMLLoader $ ControllerMethodEventHandler.handle(FXMLLoader.java:1435)
... 44更多
原因:java.lang.RuntimeException:java.lang.IllegalAccessException :类javafx.fxml.FXMLLoader $ ValueElement无法访问类customercloudfx.ManageTemplateChildController的成员与修饰符
在javafx.fxml.FXMLLoader $ ValueElement.processValue(FXMLLoader.java:661)
在javafx .fxml.FXMLLoader $ ValueElement.processStartElement(FXMLLoader.java:572)
在javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2314)
在javafx.fxml.FXMLLoader.load(FXMLLoader.java :2131)
at customercloudfx.ManageTemplateController.handleButtonAction(ManageTemplateController.java:127)
... 49更多
引发者:java.lang.IllegalAccessException:类javafx.fxml.FXMLLoader $ ValueElement不能访问类customercloudfx.ManageTemplateChildController的成员与修饰符
在sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95)
在java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject。 java:261)
在java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:253)
在java.lang.reflect.Field.doSecurityCheck(Field.java:983)
在java.lang.reflect.Field.getFieldAccessor(Field.java:927)
在java.lang.reflect.Field.set(Field.java:680)
在javafx.fxml.FXMLLoader $ ValueElement .processValue(FXMLLoader.java:659)
... 53 more


解决方案

例外说, FXMLLoader 无法通过反射访问您的ManageTemplateChildController类本身或其字段/方法。公开您的班级。在FXML文件中定义为fx:id的私有字段中添加 @FXML 注释,或者将这些字段公开,而不添加@FXML注释。


I already read next answers about passing parameters, but they didn't help me.

Below is my effort to open new FXML view from event handler which failes to pass parameter.

Kindly looking for help.

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>

This code correctly opens new Pane but throws next exception. Also Label in the child pane is not shown.

NPE comes from next line: 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

解决方案

The exception says that the FXMLLoader cannot access to your ManageTemplateChildController class itself or to its fields/methods through reflection. Make your class public. Add @FXML annotation to private fields which are defined in FXML file as "fx:id", or alternatively make these fields public without adding @FXML annotation.

这篇关于我想从其他控制器文件加载一些参数的新FXML文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆