我是JavaFx新手,因此我找不到解决问题的方法
假设我有以下应用程序结构:
- views
- first.fxml -> this has a button called btnSend and a textfield called txtEnter
- second.fxml -> this has a textarea called txtView
- Controller
- FirstController -> controller for First
- SecondController -> controller for second
- Modal
- AppModal -> here I have a getter and a setter method ,
as getText() and setText(String text)
- App
- Main.java -> This one used FXMLLoader to load first.fxml and second.fxml together.
在SecondController中显示文本的最佳/最佳方式是什么,从FirstController传递文本。我的意思是,我在txtenter
中输入一个文本,然后按下按钮btnsend
,按下按钮后,我希望文本显示在使用另一个控制器的txtview
中。我已经阅读了很多关于观察者模式
和JavaFX属性
可以用来解决这个问题的知识,但不幸的是,我无法实现一个有效的解决方案。
如果你们专家能在这方面帮助我,我将不胜感激。我知道这是不正确的,但可以任何人请给我一个以上项目结构的工作解决方案。
提前谢了。
在模型中使用可观察的StringProperty
:
public class AppModel {
private final StringProperty text = new SimpleStringProperty();
public StringProperty textProperty() {
return text ;
}
public final String getText() {
return textProperty().get();
}
public final void setText(String text) {
textProperty().set(text);
}
}
使您的控制器能够访问模型:
public class FirstController {
private final AppModel model ;
@FXML
private TextField textEnter ;
public FirstController(AppModel model) {
this.model = model ;
}
// action event handler for button:
@FXML
private void sendText() {
model.setText(textEnter.getText());
}
}
和
public class SecondController {
private final AppModel model ;
@FXML
private TextArea txtView ;
public SecondController(AppModel model) {
this.model = model ;
}
public void initialize() {
// update text area if text in model changes:
model.textProperty().addListener((obs, oldText, newText) ->
txtView.setText(newText));
}
}
AppModel model = new AppModel();
FXMLLoader firstLoader = new FXMLLoader(getClass().getResource("first.fxml"));
firstLoader.setController(new FirstController(model));
Parent firstUI = firstLoader.load();
FXMLLoader secondLoader = new FXMLLoader(getClass().getResource("second.fxml"));
secondLoader.setController(new SecondController(model));
Parent secondUI = secondLoader.load();
如果希望在FXML文件中保留
属性,则可以使用ControllerFactory
,它实际上指示FXMLLoader
如何创建控制器:
AppModel model = new AppModel();
Callback<Class<?>, Object> controllerFactory = type -> {
if (type == FirstController.class) {
return new FirstController(model);
} else if (type == SecondController.class) {
return new SecondController(model);
} else {
try {
return type.newInstance() ; // default behavior - invoke no-arg construtor
} catch (Exception exc) {
System.err.println("Could not create controller for "+type.getName());
throw new RuntimeException(exc);
}
}
};
FXMLLoader firstLoader = new FXMLLoader(getClass().getResource("first.fxml"));
firstLoader.setControllerFactory(controllerFactory);
Parent firstUI = firstLoader.load();
FXMLLoader secondLoader = new FXMLLoader(getClass().getResource("second.fxml"));
secondLoader.setControllerFactory(controllerFactory);
Parent secondUI = secondLoader.load();
您可以通过使用(更多)反射使控制器工厂更加灵活;基本上,您可以实现这样的逻辑:“如果控制器类型有一个接受AppModel
的构造函数,则调用该构造函数,否则调用no-arg构造函数”。
如果您正在创建一个大型应用程序,它需要做很多这方面的工作,那么您可以考虑使用Afterburner.fx,这是一个基本上允许您使用注释将模型注入控制器的框架。
问题内容: 我有以下两个对等控制器。这些没有父项: 在控制器1中,我想更新由Controller2控制的HTML中的变量xxx的值。有办法吗? 问题答案: 绝对使用服务在控制器之间共享数据,这是一个有效的示例。$ broadcast不是要走的路,您应该避免在有更合适的方式时使用事件系统。使用“服务”,“值”或“常量”(用于全局常量)。 http://plnkr.co/edit/ETWU7d0O8K
问题内容: 我不确定是否遇到“最佳实践”问题,试图以一种怪异而奇妙的方式解决该挑战,或者我是否还没有掌握AngularJS。 场景 :因此,我一直在尝试一种方法,使页面上多次输出“ originCity.cityName”,所有这些都引用同一工厂内的同一对象,希望将其设置为其他值(例如“测试字符串”),那么它将追溯替换我在页面周围拥有的所有内容。 在两个单独的控制器中,我对工厂进行了以下致电: 并
需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢
问题内容: 我正在使用Swift,在tableview的didSelectRowAtIndexPath方法中出现错误。我想将值传递给另一个视图控制器,即“ secondViewController”。这里,EmployeesId是一个数组。相关代码如下: 但是我收到此错误:致命错误:展开一个Optional值时意外发现nil。 任何帮助将不胜感激。 问题答案: 这是一个有两个假设的一般解决方案。首
我有两个控制器和。我正在读一本书的内容。来自的txt文件,我希望将该文本放置在的文本区域中。代码在中运行并读取良好,但当打开中的窗口时,从中读取的内容。文本内容在文本区域中不可见。我的显示String mine包含内容,但它不显示在的文本区域中。请帮助任何人。非常感谢。 FXMLDocumentController代码 在中,有一个我删除了和,这样代码就可以工作了。
问题内容: 我的图像是我试图将数据(变量)从一个阶段传递到另一阶段,但是当我尝试在第二阶段访问它们时,它们为空。mainWindow的代码。前往window1 // window1类: 如果我想访问以前收到的标题,则为null 初始化显示应该为“ Window1”时显示为null} 问题答案: 在加载FXML文件的过程中,将调用该方法-换句话说,在调用时将调用该方法。 显然,这是 在 调用 之前