Java 如何为tableView行定义setOnAction?

Java 如何为tableView行定义setOnAction?,java,javafx,tableview,Java,Javafx,Tableview,我正在编写一个具有javafx和tableView功能的程序 我的目的是,当我单击此表的一行时,另一个窗口打开并显示一些内容,但我不知道如何为我的表定义类似setOnMouseClicked的功能 我找了很多,但找不到简单的方法 这是我现有的定义表列和行的代码。(行是用可观察特性定义的) 包装样品; 导入javafx.application.application; 导入javafx.collections.FXCollections; 导入javafx.collections.Observab

我正在编写一个具有javafx和tableView功能的程序

我的目的是,当我单击此表的一行时,另一个窗口打开并显示一些内容,但我不知道如何为我的表定义类似setOnMouseClicked的功能

我找了很多,但找不到简单的方法

这是我现有的定义表列和行的代码。(行是用可观察特性定义的)

包装样品;
导入javafx.application.application;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.scene;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.control.cell.PropertyValueFactory;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类主扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
TableView TableView=新建TableView();
TableColumn column1=新的TableColumn(“用户名”);
第1列:setCellValueFactory(新属性ValueFactory(“用户名”);
第1列:设置最小宽度(100);
TableColumn column2=新的TableColumn(“密码”);
第2列:setCellValueFactory(新属性ValueFactory(“密码”);
第2列:设置最小宽度(100);
tableView.getColumns().add(column1);
tableView.getColumns().add(column2);
setItems(getAllAccounts());
VBox VBox=新的VBox(tableView);
场景=新场景(vbox,200200);
舞台窗口;
窗口=初级阶段;
window.setScene(场景);
window.show();
}
私有可观察列表getAllAccounts(){
ObservableList accounts=FXCollections.observableArrayList(Account.getAccounts());
归还账户;
}
}

您实际上有两个选择:

方法1:

表视图上实现一个单击侦听器
,并检索所选项目

// Listen for a mouse click and access the selectedItem property
tblAccounts.setOnMouseClicked(event -> {
    // Make sure the user clicked on a populated item
    if (tblAccounts.getSelectionModel().getSelectedItem() != null) {
        System.out.println("You clicked on " + tblAccounts.getSelectionModel().getSelectedItem().getUsername());
    }
});
方法2:

TableView
创建您自己的
RowFactory
,并在那里处理您的逻辑。(我更喜欢这种方法)

//创建一个新的行工厂来处理操作
tblAccounts.setRowFactory(电视->{
//定义我们的新TableRow
TableRow行=新TableRow();
row.setOnMouseClicked(事件->{
System.out.println(“在这里做你的事!”);
});
返回行;
});


方法1是最简单的方法,适用于大多数需求。对于更复杂的需求,您可能需要使用方法#2,例如设置单个行的样式,或者处理空行上的单击。

感谢您的帮助,我如何为tableView实现单击侦听器?非常感谢,有一个小问题,我的getUserName方法不起作用,在方法#2中您应该检查空行的原因是什么。否则,
row.getItem()
可能会产生意外的结果…@fabian感谢您注意,您对
TableColumn
使用了错误的类型参数顺序:第一个类型参数应该与
TableView
的类型参数匹配(在这种情况下,它与项目的类型匹配,即
帐户
),第二个是getter返回的类型(可能是
String
)。除了收听单击外,还可以选择收听所选项目。虽然行为有点不同…@fabian是的,你是对的,谢谢
// Listen for a mouse click and access the selectedItem property
tblAccounts.setOnMouseClicked(event -> {
    // Make sure the user clicked on a populated item
    if (tblAccounts.getSelectionModel().getSelectedItem() != null) {
        System.out.println("You clicked on " + tblAccounts.getSelectionModel().getSelectedItem().getUsername());
    }
});
// Create a new RowFactory to handle actions
tblAccounts.setRowFactory(tv -> {

    // Define our new TableRow
    TableRow<Account> row = new TableRow<>();
    row.setOnMouseClicked(event -> {
        System.out.println("Do your stuff here!");
    });
    return row;
});