2013-11-09 9 views
0

У меня есть одна кнопка в одном FXML и два текстовых поля в другом FXML. Эти два FXML независимы, я имею в виду, что они не вложены. Я хочу напечатать текст (который находится в двух текстовых полях) в консоли/выводе всякий раз, когда нажимается кнопка. Ниже приведены fxmls и их контроллеры:Как получить данные в одном контроллере Java FXML от другого контроллера 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: // StackOverflow. com/questions/14187963/pass-parameters-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, затем установите сеттер/приемник и другой контроллер, а затем получите доступ к значениям.

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

Я пробовал использовать шаблон дизайна singleton, но я не уверен, почему он выбрасывает исключение null-указателя, получая TextField.Вот мой код для доступа к методу getter: @FXML private void handleButtonAction (событие ActionEvent) { Строка str1 = TextController.getInstance(). GetTextField1(). GetText(); String str2 = TextController.getInstance(). GetTextField2(). GetText(); System.out.println ("текст 1 :::" + str1); System.out.println ("текст 1 :::" + str2); } – BungBung

+0

Привет, Я пробовал ленивую инициализацию и раннюю инициализацию Singleton, но никто из них не работает. Проблема заключается в том, что TextController.getInstance() возвращает NULL. Кажется, что экземпляр еще не создан. Пожалуйста помоги. – BungBung

+0

Hi SnakeDoc, он работает сейчас. Проблема в вашем коде заключается в том, что не существует метода setter для Singleton Instance. Я создал отдельный одноэлементный класс, который имеет getter и setter для текстовых полей. и я установил метод setter в методе initialize TextController.java. Спасибо – BungBung

2

С некоторыми изменениями в ответе выше (по SnakeDoc), я могу достиг функциональности.

Я создал отдельный класс Singleton:

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); 
     }  
    } 

Методы геттерные называются в классе 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) { 

     }  
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^