Bug引发https://bugs.openjdk.java.net/browse/JDK-8088542
尝试使用我编写的以下测试用例代码向JavaFx可编辑TableView添加可编辑功能时: -
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
public class Foo extends Application implements Runnable
{
@Override
public void start(Stage stage)
{
final TableView table = new TableView();
final TableColumn column = new TableColumn();
table.setEditable(true);
column.setEditable(true);
table.setItems(FXCollections.observableArrayList());
column.setCellFactory(cell -> new EditableComboBoxCell());
column.setCellValueFactory(param -> new SimpleStringProperty("foo"));
table.getColumns().add(column);
// Simple thread loop to demonstrate adding items
new Thread(() ->
{
try
{
while (true)
{
Thread.sleep(20000);
Platform.runLater(() -> table.getItems().add("foo"));
}
} catch (InterruptedException e)
{
}
}).start();
Scene scene = new Scene(new StackPane(table));
stage.setScene(scene);
stage.show();
}
@Override
public void run()
{
launch();
}
}
其中'EditableComboBoxCell'是: -
public class EditableComboBoxCell extends TableCell<String, String>
{
private ComboBox<Object> comboBox;
@Override
public void startEdit()
{
super.startEdit();
comboBox = new ComboBox<>();
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setGraphic(comboBox);
}
@Override
public void cancelEdit()
{
super.cancelEdit();
comboBox = null;
setContentDisplay(ContentDisplay.TEXT_ONLY);
setText(getItem());
}
@Override
public void updateItem(final String item, final boolean empty)
{
super.updateItem(item, empty);
if (empty)
{
setText(null);
setGraphic(null);
}
else
{
if (isEditing())
{
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setGraphic(comboBox);
}
else
{
setContentDisplay(ContentDisplay.TEXT_ONLY);
setText(getItem());
}
}
}
}
我发现如果项目是动态添加的,那么每当添加下一个项目时,组合框就会消失。我已经通过每隔几秒钟添加一个新项目来测试它。当JavaFx TableView包含静态数据时,此代码可以正常工作。
我在Java 8u45和Java 8u60(早期访问)上观察到了这种行为。
我环顾四周,发现桌面视图中没有更新项目的错误,修复方法是将列设置为不可见,然后再次可见,但这并没有解决问题。此外,该修复似乎在8u60解决,我仍然观察到这种行为。
当tableview不断添加/删除数据时,JavaFx tableview是否无法很好地处理显示的控件?有什么工作吗?