在我的JavaFX TableView中,我有一个TableColumn,我已将Cell Factory设置为呈现ProgressBar,而对于其他TableColumns,我已将Cell Factory设置为显示ToolTip.如下图所示.第二列显示进度条,其他3列呈现以显示工具提示,其中包含要显示的简单字符串值.
我遇到的问题是TableView没有在表中显示/显示更新的值,即UI没有验证/刷新/绘制TableView元素.如果我单击ColumnHeader对任何列进行排序,那么我只能看到TableView更新.手动排序表列以刷新表内容没有意义,所以我搜索并找到解决方案来显示/隐藏表列以更新表视图.
为了解决这个问题,我在下面编写了一个代码来解决TableView更新/刷新问题,但由于此代码,现在ToolTip不可见.
每个特定时间间隔后更新表视图的代码
class TableProgressBarUpdator implements Runnable {
TableView table;
public TableProgressBarUpdator(TableView fxtable) {
table = fxtable;
}
public void start() {
new Thread(this).start();
}
public void run() {
while (keepUpdating) {
try {
updateProgressbar();
Thread.sleep(1000);
} catch (Exception e) {
LogHandler.doErrorLogging("Error while updating tables cell",e);
}
}
LogHandler.doDebugLogging("Table process repainting is completed.");
}
private void updateProgressbar() throws Exception {
Platform.runLater(new Runnable() {
@Override
public void run() {
((TableColumn) table.getColumns().get(0)).setVisible(false);
((TableColumn) table.getColumns().get(0)).setVisible(true);
}
});
}
}
开始更新表视图
public void startUpdatingTableProgress() {
keepUpdating = true;
TableProgressBarUpdator tpu = new TableProgressBarUpdator(table);
tpu.start();
}
停止更新表视图
public void stopUpdatingTableProgress() {
keepUpdating = false;
}
public static class ProgressBarTableCell
public class ToolTip extends TableCell {
@Override
protected void updateItem(Object object,boolean selected) {
if (object == null) {
setGraphic(null);
setText(null);
}else{
setText(object.toString());
setTooltip(new Tooltip(object.toString()));
}
}
}
问题 –
如果我从TableProgressBarUpdator类中注释掉这两行,那么我可以看到第1,第3和第4列中每个单元格值的工具提示,但现在表格视图内容没有更新/刷新,当我联合评论这些行时,我是无法看到工具提示.
((TableColumn) table.getColumns().get(0)).setVisible(false);
((TableColumn) table.getColumns().get(0)).setVisible(true);
最佳答案
您无需手动更新TableView.您的类可能存在与该TableView列关联的问题.
你必须创建如下所示的类:
public static class Test{
private StringProperty name;
private Test() {
name = new SimpleStringProperty();
}
public Test(String name) {
this.name = new SimpleStringProperty(name);
}
public void setName(String name) {
this.name.set(name);
}
public String getName() {
return name.get();
}
public StringProperty nameProperty() {
return name;
}
}