You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:20:26