我想从其他控制器文件加载一些参数的新FXML文件 [英] I want to load new FXML file with some parameters from the other Controller Files
问题描述
我已经阅读了关于传递参数的下一个答案,但他们没有帮助我。
下面是我从事件处理程序打开新的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。
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屋!