我正在研究scalafx项目,我喜欢TableView,其中一些Cell包含一个按钮。我找到了一个如何在tablecell内放置图形的示例。当我使用示例并且仅将graphic = ...
的调用替换为使用按钮时,我有时会获得单元格,其中每列都是空的,除了按钮之外:
我该如何解决这个问题? (我已经检查过它不仅仅是名称值上的空字符串,因此最后一次登录按钮不应该存在)
以下是修改为使用按钮的示例中的代码:
new TableColumn[Person, String] {
text = "Login"
cellValueFactory = { _.value.favoriteColor }
cellFactory = { _ =>
new TableCell[Person, String] {
item.onChange { (_, _, newColor) =>
graphic = new Button {
text = "Login"
onAction = {
(e: ActionEvent) => println("pressed the button")
}
}
}
}
}
}
答案 0 :(得分:1)
(警告:我不是Scala程序员,所以我只能从JavaFX的角度来回答这个问题。你应该能够将它翻译成Scala。)
您需要检查TableCell
是否为空,如果单元格为空,则将图形设置为null
,否则设置为按钮。
此外,每次item
更改(可能非常频繁)时创建新按钮并不是一个好主意;您应该在创建新单元格时创建一次(这种情况很少见),然后在null
更改时将其设置为图形(或item
)。
在Java 8中,代码如下所示:
TableColumn<Person, String> column = new TableColumn<>("Login");
column.setCellValueFactory(data -> data.getValue().favoriteColorProperty());
column.setCellFactory( col -> {
TableCell<Person, String> cell = new TableCell<>();
Button button = new Button("Login");
button.setOnAction(event -> {
System.out.println("pressed the button");
// you can call cell.getItem() if you want to do something specific for this cell
});
cell.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
cell.itemProperty().addListener((obs, oldItem, newItem) -> {
if (newItem == null) {
cell.setGraphic(null);
} else {
cell.setGraphic(button);
}
});
return cell ;
});
这里我假设该项只有null
空单元格:如果不是这种情况,则需要子类TableCell
并覆盖updateItem(...)
方法,或观察两者默认itemProperty()
的{{1}}和emptyProperty()
。
答案 1 :(得分:1)
Heres James_D在scala中的回答:
new TableColumn[Person, String] {
text = "Login"
cellValueFactory = { _.value.name } //it actually doesn't matter which value you choose here
cellFactory = { _ =>
val cell = new TableCell[Person, String]()
val btn = new Button {
text = "Login"
onAction = { (e: ActionEvent) =>
println("Button pressed")
}
}
cell.setContentDisplay(ContentDisplay.GRAPHIC_ONLY)
cell.itemProperty().addListener(new ChangeListener[String] {
override def changed(obs: ObservableValue[_ <: String], oldItem: String, newItem: String): Unit = {
if (newItem == null) {
cell.setGraphic(null)
} else {
cell.setGraphic(btn)
}
}
})
cell
}
}