我制作了一个简单的表格,用户可以搜索书籍并购买。在一个场景中有搜索标签,并且当单击搜索按钮时,将打开新场景,其中搜索结果在表格中。问题是,当我输入例如,搜索的书名,它显示在表格中,但是当我回去,并且输入新书名称进行搜索时,表格中的单元格与之前的搜索并排在一起。我希望在输入新的搜索参数时不显示旧的搜索记录。我不使用JavaFX属性,因为我从服务器获取书籍,而JavaFX属性不可序列化。这就像桌子不爽。我试图从这个网站的类似问题实现代码,但没有结果。 我的表格代码(最后一栏是复选框)。
TableView<Knjiga> table = new TableView<Knjiga>();
ObservableList<Knjiga> data =
FXCollections.observableArrayList(list);
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
TableColumn<Knjiga, String> nameCol = new TableColumn<Knjiga, String>("Naziv");
TableColumn<Knjiga, String> authorCol = new TableColumn<Knjiga, String>("Autor");
TableColumn<Knjiga, String> costCol = new TableColumn<Knjiga, String>("Cijena");
Callback<TableColumn<Knjiga, Boolean>, TableCell<Knjiga, Boolean>> cellFactory;
TableColumn checkCol= new TableColumn<Knjiga, Boolean>();
table.setItems(data);
nameCol.setCellValueFactory(new PropertyValueFactory<Knjiga, String>("bookName"));
authorCol.setCellValueFactory(new PropertyValueFactory<Knjiga, String>("authorName"));
costCol.setCellValueFactory(new PropertyValueFactory<Knjiga, String>("cost"));
checkCol.setCellValueFactory(new PropertyValueFactory<Knjiga, Boolean>("checked"));
cellFactory = new Callback<TableColumn<Knjiga, Boolean>, TableCell<Knjiga, Boolean>>() {
@Override
public TableCell call(final TableColumn param) {
final CheckBox checkBox = new CheckBox();
final TableCell cell = new TableCell() {
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (item == null) {
checkBox.setDisable(true);
checkBox.setSelected(false);
} else {
checkBox.setDisable(false);
checkBox.setSelected(item.equals(true) ? true : false);
checkBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
for(int i = 0; i < fromServer.size(); i++)
fromServer.get(i).setQuantity(fromServer.get(i).getQuantity() - 1);
}
});
commitEdit(checkBox.isSelected() ? true : false);
}
}
};
cell.setGraphic(checkBox);
refresh(table, data);
return cell;
}
};
checkCol.setCellValueFactory(new PropertyValueFactory("checked"));
checkCol.setCellFactory(cellFactory);
答案 0 :(得分:1)
你应该删除文字&amp;当单元格为空时,它将清除以前填充的单元格。在你的情况下,图形就足够了。
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
// do stuff here
}
}
答案 1 :(得分:1)
问题解决了。事情是,当我从服务器向客户端发送书籍的ArrayList时,我没有清理列表,所以服务器发送旧的和新的对象。