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

JavaFX中点击刷新按钮后TableView不加载新数据,求解决

解决JavaFX Refresh按钮无法更新TableView的问题

首先,咱们来揪出问题的核心:你当前的Refresh按钮逻辑有个关键错误——每次点击时,你调用initTable()创建了一个全新的TableView实例,然后调用它的refresh(),但这个新表格根本没有替换掉界面上原本显示的那个表格!所以旧表格完全没收到更新通知,自然看起来没反应。

接下来咱们一步步修复:

1. 把TableView改为类成员变量

首先,不要每次调用initTable()都新建TableView,而是在类级别声明一个成员变量,这样可以复用同一个表格实例:

// 在你的类中添加成员变量
private TableView<Issues> issueTable;

2. 拆分表格初始化逻辑

把initTable()拆分成初始化表格结构和加载数据两部分,这样初始化只做一次,刷新时只更新数据:

// 初始化表格结构(只调用一次,比如在界面初始化时)
@SuppressWarnings({ "unchecked", "rawtypes" })
public void initTableStructure() throws IOException, URISyntaxException {
    issueTable = new TableView<Issues>();
    issueTable.setEditable(true);

    // 所有表格列的创建和配置逻辑都放在这里,和你原来的initTable一致
    TableColumn<Issues, Hyperlink> jiraKey = new TableColumn<>(keyField);
    jiraKey.setCellValueFactory(new PropertyValueFactory("hyperLink"));
    jiraKey.setCellFactory(new HyperlinkCell());

    TableColumn jiraPriority = new TableColumn(priorityField);
    TableColumn jiraIssueType = new TableColumn(issueTypeField);
    TableColumn jiraSummary = new TableColumn(summaryField);
    TableColumn jiraAssignee = new TableColumn(assigneeField);
    TableColumn workLogCol = new TableColumn(workLogField);
    TableColumn timeSpent = new TableColumn(timeSpentField);
    TableColumn commentTimeLog = new TableColumn(commentField);
    workLogCol.getColumns().addAll(timeSpent, commentTimeLog);

    jiraSummary.setCellValueFactory(new PropertyValueFactory("jiraSummary"));
    jiraIssueType.setCellValueFactory(new PropertyValueFactory("jiraIssueType"));
    jiraPriority.setCellValueFactory(new PropertyValueFactory("jiraPriority"));
    jiraAssignee.setCellValueFactory(new PropertyValueFactory("jiraAssignee"));

    // 注意:这里的CellEditEvent类型要改成Issues,不是JiraAuth!
    timeSpent.setCellValueFactory(new PropertyValueFactory("loghours")); // 对应Issues类的属性名
    timeSpent.setCellFactory(TextFieldTableCell.forTableColumn());
    timeSpent.setOnEditCommit(new EventHandler<CellEditEvent<Issues, String>>() {
        public void handle(CellEditEvent<Issues, String> t) {
            // 获取当前编辑的Issues对象,设置值
            Issues editedIssue = t.getTableView().getItems().get(t.getTablePosition().getRow());
            editedIssue.setLoghours(t.getNewValue());
        }
    });

    commentTimeLog.setCellValueFactory(new PropertyValueFactory("commentLogHours")); // 对应属性名
    commentTimeLog.setCellFactory(TextFieldTableCell.forTableColumn());
    commentTimeLog.setOnEditCommit(new EventHandler<CellEditEvent<Issues, String>>() {
        public void handle(CellEditEvent<Issues, String> t) {
            Issues editedIssue = t.getTableView().getItems().get(t.getTablePosition().getRow());
            editedIssue.setCommentLogHours(t.getNewValue());
            // 直接用对象的JiraKey,不用截取字符串
            String jiraKey = editedIssue.getJiraKey();
        }
    });

    issueTable.getColumns().setAll(jiraKey, jiraSummary, jiraPriority, jiraAssignee, jiraIssueType);
    issueTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    
    // 记得把这个表格添加到你的界面容器中(比如BorderPane、VBox等)
    // 示例:yourContainer.getChildren().add(issueTable);
}

// 单独的加载/刷新数据方法
private void loadIssueData() throws IOException, URISyntaxException {
    IssuesJsonParser issueObject = new IssuesJsonParser();
    ObservableList<Issues> data = issueObject.issueJsonList();
    issueTable.setItems(data);
    // 可选:如果数据更新后表格没自动刷新,手动调用
    // issueTable.refresh();
}

3. 修复Refresh按钮的逻辑

现在按钮点击时,只需要调用加载数据的方法即可:

buttons[0] = new Button("Refresh");
buttons[0].setOnAction(event->{
    try {
        loadIssueData();
    } catch (IOException | URISyntaxException e) {
        e.printStackTrace();
        // 可以添加错误提示,比如弹出Alert告知用户刷新失败
    }
});

4. 顺便修复Issues类的构造函数问题

你的Issues构造函数有几个明显的错误,会导致属性值异常:

public Issues(String jiraKey, String jiraSummary, String jiraPriority, String jiraAssignee, String jiraIssueType) {
    super();
    this.jiraKey = jiraKey; // 你之前漏掉了给jiraKey赋值!
    this.hyperLink = new Hyperlink(jiraKey); // 这里已创建Hyperlink,无需重复赋值
    this.jiraSummary = jiraSummary;
    this.jiraPriority = jiraPriority;
    this.jiraAssignee = jiraAssignee;
    this.jiraIssueType = jiraIssueType;
    // 初始化日志时长和备注字段为默认空值
    this.loghours = "";
    this.commentLogHours = "";
}

最后再检查几个关键点

  • 确保IssuesJsonParser.issueJsonList()确实能获取到最新的JIRA数据,如果方法里有缓存逻辑,要在刷新时清除缓存。
  • 表格列的PropertyValueFactory参数要和Issues类的getter方法严格匹配(JavaBean规范:属性名loghours对应getLoghours()方法)。

内容的提问来源于stack exchange,提问作者Kavya Rao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:29:39