2013-11-09 57 views
0

我在一个FXML中有一个按钮,在另一个FXML中有两个文本字段。这两个FXML是独立的,我的意思是它们不是嵌套的。我想要在控制台/输出中打印文本(位于两个文本字段中),只要点击按钮即可。下面是fxmls及其控制器:如何从另一个FXML控制器获取一个Java FXML控制器中的数据(这些控制器不是嵌套控制器)?

Button.fxml

<AnchorPane id="AnchorPane" prefHeight="200.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml" fx:controller="textboxandbuttonbinding.ButtonController"> 
     <children> 
     <Button fx:id="button" layoutX="126.0" layoutY="90.0" onAction="#handleButtonAction" text="Button" /> 
     </children> 
    </AnchorPane> 

ButtonController.java

public class ButtonController implements Initializable { 

     @FXML 
     private void handleButtonAction(ActionEvent event) { 

     } 

     @Override 
     public void initialize(URL url, ResourceBundle rb) { 

     }  
    } 

Text.fxml

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="textboxandbuttonbinding.Sample1111Controller"> 
     <children> 
      <TextField fx:id="textField1" layoutX="186.0" layoutY="133.0" prefWidth="200.0" promptText="text 1" /> 
      <TextField fx:id="textField2" layoutX="186.0" layoutY="200.0" prefWidth="200.0" promptText="text2" /> 
     </children> 
    </AnchorPane> 

TextController.java

public class TextController implements Initializable { 
     @FXML 
     private TextField textField1; 
     @FXML 
     private TextField textField2; 

     @Override 
     public void initialize(URL url, ResourceBundle rb) { 

     }  
    } 

我该如何实现此功能?我已经考虑到这两个FXML在两个不同的窗口同时加载。

+0

您可以使用此解决方案:HTTP://计算器。 com/questions/14187963 /传递参数-javafx-fxml或这个解决方案http://stackoverflow.com/questions/14511016/how-can-i-use-a-variable-from-another-controller-in-javafx或即使这个解决方案http:// stackoverflow.com/questions/9717852/how-to-pass-object-created-in-fxml-controller1-to-controller2-of-inner-fxml-cont/10718683#10718683 –

+0

您提供的解决方案主要是将数据设置为另一控制器。我想要的是从另一个FXML获取数据,特别是从TextField获取数据。我认为SnakeDoc给出的解决方案应该可行,但我不确定它为什么不起作用。请帮助我完全卡在这里。 – BungBung

回答

1

将你的控制器变成一个Singleton,然后有一个setter/getter和另一个Controller,然后访问这些值。

public class TextController implements Initializable { 

    private TextController instance; 

    private TextController() {}; 

    public static TextController getInstance() { 
     if (TextController.instance == null) { 
      synchronized (TextController.class) { 
       if (TextController.instance == null) { 
        TextController.instance = new TextController(); 
       } 
      } 
     } 
     return TextController.instance; 
    } 

    @FXML 
    private TextField textField1; 

    public TextField getTextField1() { 
     return textField1; 
    } 
    @FXML 
    private TextField textField2; 

    public TextField getTextField2() { 
     return textField2; 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

    }  
} 

然后在您的其他控制器,你可以这样做:

TextController.getInstance().getTextField1(); 

+0

我曾尝试使用单例设计模式,但我不知道为什么它会抛出空指针异常获取TextField。这里是我访问getter方法的代码: @FXML private void handleButtonAction(ActionEvent event){ String str1 = TextController.getInstance()。getTextField1()。getText(); String str2 = TextController.getInstance()。getTextField2()。getText(); System.out.println(“text 1 :::”+ str1); System.out.println(“text 1 :::”+ str2); } – BungBung

+0

嗨,我试过惰性初始化和早期初始化单例,但他们都没有工作。问题是TextController.getInstance()返回NULL。看起来像实例还没有创建。请帮忙。 – BungBung

+0

嗨SnakeDoc,它现在工作。你的代码中的问题是没有单例实例的setter方法。我创建了一个单独的单例类,它具有Textfields的getter和setter。我在TextController.java的initialize方法中设置了setter方法。谢谢 – BungBung

2

随着上述答案(由SnakeDoc)做一些修改,我能够实现的功能。

我已经创建了一个单独的单例类:

Singleton.java

public class Singleton { 
     private static Singleton instance = new Singleton(); 
     public static Singleton getInstance(){ 
      return instance; 
     } 

     private TextField txtField1; 
     private TextField txtField2; 

     public TextField getTxtField2() { 
      return txtField2; 
     } 

     public void setTxtField2(TextField txtField2) { 
      this.txtField2 = txtField2; 
     } 

     public TextField getTxtField1() { 
      return txtField1; 
     } 

     public void setTxtField1(TextField txtField1) { 
      this.txtField1 = txtField1; 
     } 

    } 

文本字段被设置在初始化方法设置。

TextController.java

public class TextController implements Initializable { 

     @FXML 
     private TextField textField1; 

     @FXML 
     private TextField textField2; 

     @Override 
     public void initialize(URL url, ResourceBundle rb) { 
      Singleton.getInstance().setTxtField1(textField1); 
      Singleton.getInstance().setTxtField2(textField2); 
     }  
    } 

的getter方法调用的类ButtonController.java

ButtonController.java

public class ButtonController implements Initializable {  

     @FXML 
     private void handleButtonAction(ActionEvent event) { 
      String str1 = Singleton.getInstance().getTxtField1().getText(); 
      String str2 = Singleton.getInstance().getTxtField2().getText(); 

      System.out.println(str1); 
      System.out.println(str2); 

     } 

     @Override 
     public void initialize(URL url, ResourceBundle rb) { 

     }  
    } 
相关问题