JavaFX表格应用启动异常求助:FXML事件解析失败+数据加载问题
问题分析与解决方案
先看你抛出的异常核心信息:
Error resolving onEditStart='#click', either the event handler is not in the Namespace or there is an error in the script.
这说明你的FXML文件里某个组件(大概率是TableColumn)设置了onEditStart="#click"事件,但你的Controller类里没有定义名为click的公共方法,这是导致应用启动失败的直接原因。
除此之外,你的Controller代码还有一个严重问题:你用@FXML注解注入了TableView和TableColumn组件,但在initialize方法里又重新new了一遍这些组件,这会把FXML文件中创建的实例完全覆盖,导致后续的配置都不会作用到界面上的真实组件。
接下来分两步解决:
1. 修复FXML中的事件绑定问题
打开你的sample.fxml文件,找到第15行(报错提示的行),找到带有onEditStart="#click"属性的组件,要么:
- 删除这个
onEditStart属性(如果你不需要编辑事件的话); - 要么在Controller类中添加对应的处理方法,比如:
@FXML public void click(TableColumn.CellEditEvent<Person, ?> event) { // 这里写你的编辑事件逻辑(如果需要的话) }
2. 修复Controller中的组件初始化问题
删除initialize方法中重新new组件的代码,因为@FXML已经帮你把FXML里的组件实例注入进来了,不需要自己创建。修改后的Controller代码如下:
import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import java.net.URL; import java.util.ResourceBundle; public class Controller implements Initializable { @FXML private TableView<Person> table; @FXML private TableColumn<Person, Integer> number; @FXML private TableColumn<Person, String> name; @FXML private TableColumn<Person, String> surname; @Override public void initialize(URL location, ResourceBundle resources) { // 直接使用@FXML注入的组件实例,不要重新new number.setCellValueFactory(new PropertyValueFactory<>("id")); name.setCellValueFactory(new PropertyValueFactory<>("name")); surname.setCellValueFactory(new PropertyValueFactory<>("surname")); ObservableList<Person> data = FXCollections.observableArrayList( new Person(1,"fa","fafe") ); table.setItems(data); // 注意:如果你的FXML文件里已经把columns添加到TableView中了,这一行可以删掉 // table.getColumns().addAll(number,name,surname); } }
额外注意点
- 确保你的
Person类有对应的公共getter方法(比如getId()、getName()、getSurname()),因为PropertyValueFactory依赖这些方法来获取数据; - 检查FXML文件中
TableView和TableColumn的fx:id属性是否和Controller里@FXML注解的变量名完全一致(大小写敏感); - 如果FXML里已经把
TableColumn添加到TableView的columns列表中,Controller里就不需要再调用table.getColumns().addAll(...)了,否则会导致列重复显示。
按照上面的步骤修改后,你的应用应该就能正常启动并展示表格数据了。
内容的提问来源于stack exchange,提问作者Jahongir Sabirov
相关产品推荐
相关产品推荐

