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
相关产品推荐
相关产品推荐

