【问题标题】:How to set click event for a cell of a table column in a Tableview?如何为表格视图中表格列的单元格设置点击事件?
【发布时间】:2016-02-22 19:20:09
【问题描述】:

我在 TabPane 的其中一个选项卡中有一个 TableView。我想在单元格 user id 上添加一个点击事件,这样当用户点击特定的用户 id 时,我会打开一个包含用户特定详细信息的新选项卡。如何为列中的所有单元格添加事件监听器?

<TableView fx:controller="tableViewController"
    fx:id="tableViewTable" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
    <columnResizePolicy>
        <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
    </columnResizePolicy>
    <columns>
        <TableColumn text="First Name">
            <cellValueFactory>
                <PropertyValueFactory property="firstName" />
            </cellValueFactory>
        </TableColumn>
        <TableColumn text="Last Name">
            <cellValueFactory>
                <PropertyValueFactory property="lastName" />
            </cellValueFactory>
        </TableColumn>
        <TableColumn text="User Id">
            <cellValueFactory>
                <PropertyValueFactory property="userId" />
            </cellValueFactory>
        </TableColumn>
    </columns>
</TableView>

这个博客http://java-buddy.blogspot.com/2013/05/detect-mouse-click-on-javafx-tableview.html 讨论了以编程方式捕获点击事件,在使用 FXML 时我该如何做类似的事情?

【问题讨论】:

  • 您不能在 FXML 中真正做到这一点;您只能在单元格工厂中获取表格单元格。因此,您必须在控制器中执行此操作。 (FXML 几乎只用于布局。)

标签: mouseevent javafx-8 fxml


【解决方案1】:

您需要在控制器中执行此操作。在表格列中添加fx:id(比如fx:id="userIdColumn"),然后在控制器中为该列设置单元工厂:

public class TableViewController {

    @FXML
    private TableColumn<User, String> userIdColumn ;

    public void initialize() {
        userIdColumn.setCellFactory(tc -> {
            TableCell<User, String> cell = new TableCell<User, String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty) ;
                    setText(empty ? null : item);
                }
            };
            cell.setOnMouseClicked(e -> {
                if (! cell.isEmpty()) {
                    String userId = cell.getItem();
                    // do something with id...
                }
            };
            return cell ;
        });

        // other initialization code...
    }

    // other controller code...

}

这里我假设您的表显示了您创建的某个类User 的对象,并且用户ID 是String。显然你可以根据需要调整类型。

【讨论】:

  • 我还没有完全理解 lambda 表达式,请您详细说明 setCellFactory() 中发生了什么?
  • 单元格工厂是一个函数,它将表格列(我称之为tc,从未使用过)映射到TableCells,用于显示该列中每个单元格中的数据。因此,当表格视图需要该列的表格单元格时,它会调用您提供的函数。
  • 我很难理解 lambda 表达式,所以用旧的方式来声明匿名对象。现在我能够捕获点击事件。但现在的问题是,User id 列不再显示值了?我应该将 UserId 属性值绑定到初始化方法中的单元格吗?早些时候,以下行代码绑定了 value 。
  • 你仍然需要cellValueFactory,你只需要另外cellFactory
  • hmm.. 当我添加 cellFactory 定义时,它不再显示 userId 的值。我在初始化方法中填充用户列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
相关资源
最近更新 更多