TableView中的自定义单元格

时间:2014-08-05 11:54:24

标签: scala javafx scalafx

我正在研究scalafx项目,我喜欢TableView,其中一些Cell包含一个按钮。我找到了一个如何在tablecell内放置图形的示例。当我使用示例并且仅将graphic = ...的调用替换为使用按钮时,我有时会获得单元格,其中每列都是空的,除了按钮之外:

screenshot

我该如何解决这个问题? (我已经检查过它不仅仅是名称值上的空字符串,因此最后一次登录按钮不应该存在)

以下是修改为使用按钮的示例中的代码:

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")
                }
              }
            }
          }
        }
}

2 个答案:

答案 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
  }
}