2013-11-09 138 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) { 

     }  
    } 
相關問題