2014-03-07 186 views
0

我已經閱讀了關於傳遞參數的下一個答案,但他們沒有幫助我。我想從其他控制器文件加載新的FXML文件

下面是我努力開拓從中failes傳遞參數事件處理新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也未顯示。 ()()()()()()()()()()()()()()()()()()()()()()

堆棧跟蹤:

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 
+0

這與[tag:Swing]有什麼關係? –

+0

@AndrewThompson:這就是爲什麼你低估了我? –

+0

超過600名代表。並認定你自己是一個'Swing-FX2GURU'你應該知道a)不要因爲你喜歡它而在貼子上貼標籤。 b)Swing和Java-FX的區別。 –

回答

1

例外說,FXMLLoader無法訪問您的ManageTemplateChildController類本身或者其字段/方法通過反思。公開你的課程。將@FXML註釋添加到在FXML文件中定義爲「fx:id」的專用字段,或者在不添加@FXML註釋的情況下公開這些字段。

+0

我接受你的答案作爲我的解決方案!!再次感謝! –

1

您提供有它的一切聯繫。對於那些對How to pass data between Controllers有懷疑的人來說,這是最好的答案之一!

但是,你的情況,我會建議使用Binding傳遞參數的裏面!您的ChildController中可以有id,您可以將其綁定到MainController's id。因此,id的值自動在控制器之間傳遞

您可以查看以下URL以更好地理解,或者如果您能夠顯示,您如何在MainController中獲取ID,可能我可以幫助您一些代碼!

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

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

編輯 - 從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); 
} 
+0

我成功傳遞參數,但無法打開該FXML文件..所以如何加載該FXML文件? –

+0

它在'ManageTemplateChildController控制器= 加載器中給了我一個nullpointer異常。 getController();'line? –

+0

你使用fxml文件加載你的'loader'嗎? – ItachiUchiha

相關問題