1

我正在开发一个 scalafx 项目,我想要一个 TableView,其中一些单元格包含一个按钮。我找到了一个如何将图形放入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")
                }
              }
            }
          }
        }
}
4

2 回答 2

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(...)方法,或者同时观察default的 theitemProperty()和 the 。emptyProperty()TableCell

于 2014-08-06T03:09:08.840 回答
0

这是 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
  }
}
于 2014-08-07T07:43:40.177 回答