如何从另一个FXML控制器(这些控制器不是嵌套控制器)获取一个Java FXML控制器中的数据?
我在一个FXML中有一个按钮,在另一个FXML中有两个文本字段。这两个FXML是独立的,我的意思是它们不是嵌套的。每当单击按钮时,我想在控制台/输出中打印文本(在两个文本字段中)。以下是fxmls及其控制器: Button.fxml如何从另一个FXML控制器(这些控制器不是嵌套控制器)获取一个Java FXML控制器中的数据?,java,javafx-2,javafx,viewcontroller,fxml,Java,Javafx 2,Javafx,Viewcontroller,Fxml,我在一个FXML中有一个按钮,在另一个FXML中有两个文本字段。这两个FXML是独立的,我的意思是它们不是嵌套的。每当单击按钮时,我想在控制台/输出中打印文本(在两个文本字段中)。以下是fxmls及其控制器: Button.fxml <AnchorPane id="AnchorPane" prefHeight="200.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml" fx:controller="textboxandbu
<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>
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>
如何实现此功能?我已经考虑到这两个FXML作为两个不同的窗口同时加载。将您的控制器转换为单例,然后使用setter/getter和另一个控制器,然后访问值
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();
等等。将控制器转换为单例,然后使用setter/getter和另一个控制器,然后访问值
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();
等等。将控制器转换为单例,然后使用setter/getter和另一个控制器,然后访问值
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();
等等。将控制器转换为单例,然后使用setter/getter和另一个控制器,然后访问值
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();
等等。通过对上述答案的一些修改(由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;
}
}
文本字段在initialize方法中设置
TextController.java
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
getter方法在ButtonController.java类中调用
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
ButtonController.java
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
通过对上述答案的一些修改(通过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;
}
}
文本字段在initialize方法中设置
TextController.java
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
getter方法在ButtonController.java类中调用
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
ButtonController.java
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
通过对上述答案的一些修改(通过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;
}
}
文本字段在initialize方法中设置
TextController.java
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
getter方法在ButtonController.java类中调用
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
ButtonController.java
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
通过对上述答案的一些修改(通过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;
}
}
文本字段在initialize方法中设置
TextController.java
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
getter方法在ButtonController.java类中调用
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
ButtonController.java
public class ButtonController implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
public class TextController implements Initializable {
@FXML
private TextField textField1;
@FXML
private TextField textField2;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
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);
}
}
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) {
}
}
您可以使用此解决方案:或者此解决方案,甚至此解决方案。您提供的解决方案主要是将数据设置到另一个控制器。我想要的是从另一个FXML获取数据,特别是从TextField。我认为蛇医给出的解决方案应该有效,但我不确定为什么它不起作用。请帮助我,我完全被困在这里。您可以使用此解决方案:或者此解决方案,甚至此解决方案。您提供的解决方案主要是将数据设置到另一个控制器。我想要的是从另一个FXML获取数据,特别是从TextField。我认为蛇医给出的解决方案应该有效,但我不确定为什么它不起作用。请帮助我,我完全被困在这里。您可以使用此解决方案:或者此解决方案,甚至此解决方案。您提供的解决方案主要是将数据设置到另一个控制器。我想要的是从另一个FXML获取数据,特别是从TextField。我认为蛇医给出的解决方案应该有效,但我不确定为什么它不起作用。请帮助我,我完全被困在这里。您可以使用此解决方案:或者此解决方案,甚至此解决方案。您提供的解决方案主要是将数据设置到另一个控制器。我想要的是从另一个FXML获取数据,特别是从TextField。我认为蛇医给出的解决方案应该有效,但我不确定为什么它不起作用。请帮助我,我完全被困在这里了。我尝试过使用单例设计模式,但我不知道为什么它会抛出空指针异常来获取文本字段。下面是访问getter方法的代码:@FXML private void handleButtonAction(ActionEvent事件){String str1=TextController.getInstance().getTextField1().getText();String str2=TextController.getInstance().getTextField2().getText();System.out.println(“text 1::”+str1);System.out.println([text 1::“+str2);}您好,我尝试了Singleton的延迟初始化和早期初始化,但都不起作用。问题是TextController.getInstance()返回NULL。实例似乎尚未创建。请帮助。嗨,SnakeDoc,它现在正在工作。代码中的问题是singleton实例没有setter方法。我已经创建了一个单独的singleton类,其中包含文本字段的getter和setter。我在TextController.j的initialize方法中设置setter方法ava.Thankswas不在办公室——是的,我忘了在我的示例代码中添加setter,我很忙!很高兴你能让它工作:)在这种情况下这很好,但是如果你想包含由同一个FXML文件创建的多个节点(它们都共享同一个控制器,因此无法正常工作),那么就不起作用了。JavaFX提供了很多机制来处理这种情况,而无需像这样重新构造设计。看到我在上发布的解决方案了吗?我已经尝试过使用singleton设计模式,但我不确定为什么它会抛出null指针异常来获取TextField。下面是访问getter方法的代码:@FXML private void handleButtonAction(ActionEvent事件){String str1=TextControl