如何在JavaFX TableView中hover一行时发生一些事情?

现在,当在tableview中选择了一行时,我在鼠标位置显示了对话框。 当我将鼠标hover在每一行上时,我希望显示对话框,似乎有一个CSS:hover所以我认为它可以在某些容量的Java代码中捕获。

您可以创建自定义表行工厂,该工厂向该行的hover属性添加侦听器,并在hover状态更改时执行操作。

下面是一些示例代码,当用户将鼠标hover在表行上时,它会更新标签:

table.setRowFactory(tableView -> { final TableRow row = new TableRow<>(); row.hoverProperty().addListener((observable) -> { final Person person = row.getItem(); if (row.isHover() && person != null) { label.setText("Address Book: " + person.getFirstName() + " " + person.getLastName() ); } else { label.setText("Address Book"); } }); return row; }); 

在示例图像中,鼠标指针(未显示)hover在Emma Jones的行上,因此标题标题被修改为“Address Book:Emma Jones”

悬停样本

以下是从Oracle JavaFX TableView教程示例代码中采用的完整示例:

 import javafx.application.Application; import javafx.beans.property.SimpleStringProperty; import javafx.collections.*; import javafx.geometry.Insets; import javafx.scene.*; import javafx.scene.control.*; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.VBox; import javafx.scene.text.Font; import javafx.stage.Stage; public class TableViewSample extends Application { private TableView table = new TableView(); private final ObservableList data = FXCollections.observableArrayList( new Person("Jacob", "Smith", "jacob.smith@example.com"), new Person("Isabella", "Johnson", "isabella.johnson@example.com"), new Person("Ethan", "Williams", "ethan.williams@example.com"), new Person("Emma", "Jones", "emma.jones@example.com"), new Person("Michael", "Brown", "michael.brown@example.com") ); public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { final Label label = new Label("Address Book"); label.setFont(new Font("Arial", 20)); table.setEditable(true); TableColumn firstNameCol = new TableColumn<>("First Name"); firstNameCol.setMinWidth(100); firstNameCol.setCellValueFactory( new PropertyValueFactory<>("firstName")); TableColumn lastNameCol = new TableColumn<>("Last Name"); lastNameCol.setMinWidth(100); lastNameCol.setCellValueFactory( new PropertyValueFactory<>("lastName")); TableColumn emailCol = new TableColumn<>("Email"); emailCol.setMinWidth(200); emailCol.setCellValueFactory( new PropertyValueFactory<>("email")); table.setRowFactory(tableView -> { final TableRow row = new TableRow<>(); row.hoverProperty().addListener((observable) -> { final Person person = row.getItem(); if (row.isHover() && person != null) { label.setText( "Address Book: " + person.getFirstName() + " " + person.getLastName() ); } else { label.setText("Address Book"); } }); return row; }); table.setItems(data); table.getColumns().addAll(firstNameCol, lastNameCol, emailCol); final VBox vbox = new VBox(10); vbox.setPadding(new Insets(10)); vbox.getChildren().addAll(label, table); Scene scene = new Scene(vbox); stage.setScene(scene); stage.show(); } public static class Person { private final SimpleStringProperty firstName; private final SimpleStringProperty lastName; private final SimpleStringProperty email; private Person(String fName, String lName, String email) { this.firstName = new SimpleStringProperty(fName); this.lastName = new SimpleStringProperty(lName); this.email = new SimpleStringProperty(email); } public String getFirstName() { return firstName.get(); } public void setFirstName(String fName) { firstName.set(fName); } public String getLastName() { return lastName.get(); } public void setLastName(String fName) { lastName.set(fName); } public String getEmail() { return email.get(); } public void setEmail(String fName) { email.set(fName); } } }