【发布时间】:2016-03-07 09:26:00
【问题描述】:
我有一个有 4 行的 TableView,每行都有一个自定义单元格。第一个只是一个图像,我想更新几次,一个字符串,一个带有自动换行的字符串和第二个图像作为按钮。
// image
tcUrlStatus.setCellValueFactory(new ColumnImageFactory());
tcUrlStatus.setCellFactory(new ColumnCallback());
// one line string
tcUrlName.setCellValueFactory(new ColumnNameFactory());
tcUrlName.setCellFactory(new ColumnCallback());
// two line string
tcUrlDate.setCellValueFactory(new ColumnDateFactory());
tcUrlDate.setCellFactory(new ColumnCallback());
// image as a button
tcDelete.setCellValueFactory(new ColumnDeleteFactory());
tcDelete.setCellFactory(new ColumnCallback());
这里是自定义单元格
class ColumnCallback implements Callback<TableColumn<Quartet<Boolean, String, String, String>, Object>, TableCell<Quartet<Boolean, String, String, String>, Object>>{
@Override
public TableCell<Quartet<Boolean, String, String, String>, Object> call(TableColumn<Quartet<Boolean, String, String, String>, Object> column) {
return new ColumnCell();
}
}
class ColumnImageFactory implements Callback<TableColumn.CellDataFeatures<Quartet<Object, String, String, String>, String>, ObservableValue<Object>> {
@Override
public ObservableValue<Object> call(TableColumn.CellDataFeatures<Quartet<Object, String, String, String>, String> data) {
return new ReadOnlyObjectWrapper<>(data.getValue().getValue0());
}
}
class ColumnNameFactory implements Callback<TableColumn.CellDataFeatures<Quartet<Boolean, String, String, String>, String>, ObservableValue<String>> {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Quartet<Boolean, String, String, String>, String> data) {
return new ReadOnlyObjectWrapper<>(data.getValue().getValue1());
}
}
class ColumnDateFactory implements Callback<TableColumn.CellDataFeatures<Quartet<Boolean, String, String, String>, Object>, ObservableValue<Object>> {
@Override
public ObservableValue<Object> call(TableColumn.CellDataFeatures<Quartet<Boolean, String, String, String>, Object> data) {
return new ReadOnlyObjectWrapper<>(data.getValue().getValue2());
}
}
class ColumnDeleteFactory implements Callback<TableColumn.CellDataFeatures<Quartet<Boolean, String, String, String>, Object>, ObservableValue<Object>> {
@Override
public ObservableValue<Object> call(TableColumn.CellDataFeatures<Quartet<Boolean, String, String, String>, Object> data) {
return new ReadOnlyObjectWrapper<>(data.getValue().getValue3());
}
}
class ColumnCell extends TableCell<Quartet<Boolean, String, String, String>, Object> {
@Override
protected void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
if (item instanceof Boolean) {
setText(null);
Image image;
AnchorPane pane = new AnchorPane();
if ((boolean) item) {
image = new Image(Main.class.getResourceAsStream("/hourglass.gif"));
} else {
image = new Image(Main.class.getResourceAsStream("/clean.gif"));
}
ImageView imageView = new ImageView(image);
imageView.setFitWidth(30);
imageView.setY(5);
imageView.setPreserveRatio(true);
imageView.setSmooth(true);
pane.getChildren().add(imageView);
setGraphic(pane);
}else {
if (item instanceof String) {
if (item.equals("delete")) {
AnchorPane pane = new AnchorPane();
Image image = new Image(Main.class.getResourceAsStream("/cross.png"));
ImageView imageView = new ImageView(image);
imageView.setFitWidth(20);
imageView.setY(10);
imageView.setPreserveRatio(true);
imageView.setSmooth(true);
imageView.setCursor(Cursor.HAND);
pane.getChildren().add(imageView);
imageView.setOnMouseClicked((Event event) -> {
Quartet<Boolean, String, String, String> row = this.getTableView().getSelectionModel().getSelectedItem();
Controller.localJson.remove(row.getValue1());
this.getTableView().getItems().remove(row);
});
setGraphic(pane);
} else {
HBox pane = new HBox();
Label label = new Label();
label.setText((String) item);
label.setTextAlignment(TextAlignment.CENTER);
if (((String) item).length() < 20) {
label.setWrapText(true);
label.setAlignment(Pos.CENTER);
}
pane.setPrefHeight(40);
label.setPrefHeight(40);
pane.getChildren().add(label);
setGraphic(pane);
}
setText(null);
}
}
} else {
setText(null);
setGraphic(null);
}
}
}
现在我想更改 tcUrlStatus 列/单元格的图像。我已经想出了如何获取行或它的值,但我不知道如何设置值或者更确切地说从 true 更改为 false 或从 false 更改为 true 以更新图像。
获取行和值:
private int getTableRowIndex(String url){ // url is the second column
int counter = 0;
for (Object row:tvUrls.getItems()){
if ((((Quartet) row).getValue1() == url)){
return counter;
}
counter ++;
}
return -1;
}
int rowIndex = getTableRowIndex(url);
Object item = tvUrls.getItems().get(rowIndex);
【问题讨论】:
标签: java javafx set tableview tablecell