- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序(出于这个问题的目的)包含3个组件。
有问题的主视图(带有控制器),其中包含一个TableView
该视图的表项的模型(TableMessage)
线程侦听器,用于侦听要添加到表中的消息
将项目添加到连接的ObservableList时,TableView无法更新时遇到了问题。如果在控制器的initialize
方法中添加示例数据,则数据显示良好。但是,当我从程序的其他位置(在本例中为侦听器)调用相同的方法进行添加时,TableView不会更新。调试时,我可以看到数据已添加到连接的List中(并且示例数据在那里,因此我知道它是正确的对象)。
控制器:
@FXML
private TableView<TableMessage> messageTable;
@FXML
private TableColumn<TableMessage, String> messageIDColumn;
@FXML
private TableColumn<TableMessage, String> timestampColumn;
@FXML
private TableColumn<TableMessage, String> reportTypeColumn;
@FXML
private TableColumn<TableMessage, String> tNumberColumn;
private ObservableList<TableMessage> tableContent = FXCollections.observableArrayList();
@FXML
public void initialize() {
linkColumns();
// this works
addRow(new TableMessage("001", "today", "1", "10"));
}
private void linkColumns() {
messageIDColumn.setCellValueFactory(new PropertyValueFactory<TableMessage, String>("messageID"));
timestampColumn.setCellValueFactory(new PropertyValueFactory<TableMessage, String>("timestamp"));
reportTypeColumn.setCellValueFactory(new PropertyValueFactory<TableMessage, String>("reportType"));
tNumberColumn.setCellValueFactory(new PropertyValueFactory<TableMessage, String>("tNumber"));
messageTable.setItems(tableContent);
}
public void addRow(TableMessage row) {
tableContent.add(row);
}
public class TableMessage{
private SimpleStringProperty messageID = new SimpleStringProperty ("");
private SimpleStringProperty timestamp = new SimpleStringProperty ("");
private SimpleStringProperty reportType = new SimpleStringProperty ("");
private SimpleStringProperty tNumber = new SimpleStringProperty ("");
// all my constructors, getters, setters below
...
}
// same sample code as before, doesn't work here (reference to myController is set separately)
myController.addRow(new TableMessage("001", "today", "1", "10"));
FXMLLoader loader = new FXMLLoader(getClass().getResource("MessageView.fxml"));
loader.load();
messageViewController= (MessageViewController) loader.getController();
SpringContext
(用于侦听器)向下传递到INTO
messageViewController
中,这将从该
SpringContext
创建侦听器。
messageViewController
myListener.setReferenceToController(this);
public void setReferenceToController(MessageController ref) {
this.messageController = ref;
}
initialize
中调用的)。听众?
最佳答案
当FXMLLoader
在FXML文件的根元素中遇到fx:controller
属性时,其默认行为是通过调用其无参数构造函数来创建该属性指定的控制器类的新实例,并将其用作该FXML定义的视图的控制器。
因此,当您通过代码获得对控制器的引用时
FXMLLoader loader = new FXMLLoader(getClass().getResource("MessageView.fxml"));
loader.load();
messageViewController= (MessageViewController) loader.getController();
FXMLLoader
创建
MessageViewController
的新实例,并将其与
MessageView.fxml
定义的视图的新实例相关联。由于您放弃了该视图(对返回值
loader.load()
不执行任何操作),因此您具有引用的控制器与未显示的视图相关联。
FXMLLoader
仍将调用
initialize(...)
,因此
initialize()
方法的任何效果将在您获得的引用中可见。)
MessageView.fxml
来创建您实际显示的视图。当
FXMLLoader
使用
Nested Controllers技术加载包含的FXML文件时,可以注入对创建的控制器的引用。简要地说,将
fx:id
添加到
<fx:include>
元素。通过将
"Controller"
附加到
fx:id
注释字段名称中的
@FXML
属性的值,可以将包含文件中的控制器从包含FXML文件注入到控制器中。例如:
<!-- xml headers and imports etc -->
<BorderPane fx:controller="com.example.MainController" ... >
<!-- ... -->
<fx:include source="MessageView.fxml" fx:id="messageView"/>
<!-- ... -->
</BorderPane>
public class MainController {
@FXML
private MessageViewController messageViewController ;
public void initialize() {
// messageViewController will be initialized and be a reference to the controller
// for the included messageView
// ...
}
}
<fx:include>
的情况下实际上无济于事)是从FXML文件中删除
fx:controller
属性,然后直接在
FXMLLoader
上设置控制器:
FXMLLoader loader = new FXMLLoader(getClass().getResource("MessageView.fxml"));
MessageViewController myController = new MessageViewController();
loader.setController(myController);
// calling load will now inject @FXML-annotated fields and call initialize() on myController
Parent view = loader.load();
fx:controller
属性的FXML文件,则会发生运行时异常,并且加载将失败。
controllerFactory
。控制器工厂本质上是一个将
Class<?>
映射到控制器实例的函数(可能是该类的实例,但没有强制执行)。这里要注意的一个重要功能是
controllerFactory
会向下传播到
<fx:include>
s。换句话说,当加载FXML并包含
<fx:include>
标记时,将使用与加载周围FXML相同的控制器工厂来加载包含的FXML。
public class Model {
private ObservableList<TableMessage> messages = FXCollections.observableArrayList();
public ObservableList<TableMessage> getMessages() {
return messages ;
}
}
Model model = new Model() ;
Callback<Class<?>, Object> controllerFactory = clazz -> {
try {
// see if controller class has a constructor taking a Model:
for (Constructor<?> constructor : class.getConstructors()) {
if (constructor.getParameterCount() == 1
&& constructor.getParameterTypes()[0] == Model.class) {
return constructor.newInstance(model);
}
}
// no suitable constructor, just invoke no-arg constructor:
return clazz.newInstance();
} catch (RuntimeException exc) {
throw exc ;
} catch (Exception exc) {
throw new RuntimeException(exc);
}
};
FXMLLoader loader = new FXMLLoader(...);
loader.setControllerFactory(controllerFactory);
Parent mainView = loader.load();
public class MainController {
private final Model model ;
@FXML
private TableView<TableMessage> messageTable ;
public MainController(Model model) {
this.model = model ;
}
public void initialize() {
messageTable.setItems(model.getMessages());
// ...
}
}
public class MessageViewController {
private final Model model ;
public MessageViewController(Model model) {
this.model = model ;
}
@FXML
public void addMessage() {
model.getMessages().add(...);
}
}
@Inject
,因此您只需注入共享模型实例即可。
ApplicationContext applicationContext = ... ;
FXMLLoader loader = new FXMLLoader(...);
loader.setControllerFactory(applicationContent::getBean);
Parent view = loader.load();
FXMLLoader
将通过调用
applicationContext.getBean(Class<?>)
并传递
fx:controller
属性指定的类来获取控制器实例。这样,您可以使用弹簧注入将模型实例(或任何您需要的)注入控制器。您可以在
fx:controller
属性中使用接口名称,并让您的spring配置选择接口的实现。由于上述原因,强烈建议将控制器bean的范围设为
prototype
(尽管注入的模型bean的范围可以设为
singleton
)。只是一些想法...
关于java - JavaFX TableView不会在初始化方法之外更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32099724/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!