如何在 JavaFX TableView 中的行悬停时发生某些事情?

2024-01-08

现在,当在表格视图中选择一行时,我会在鼠标位置显示对话框。 我希望当我将鼠标悬停在每一行上时显示对话框,似乎有一个 CSS :hover 所以我认为它可以以某种方式在 java 代码中捕获。


您可以创建一个自定义表行工厂,它将侦听器添加到行的悬停属性中,并在悬停状态发生变化时采取操作。

以下是一些示例代码,当用户将鼠标悬停在表行上时更新标签:

table.setRowFactory(tableView -> {
    final TableRow<Person> 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;
});

在示例图像中,鼠标指针(未显示)悬停在 Emma Jones 的行上,因此标题标题被修改为“地址簿: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<Person> table = new TableView<Person>();
    private final ObservableList<Person> data =
        FXCollections.observableArrayList(
            new Person("Jacob", "Smith", "[email protected] /cdn-cgi/l/email-protection"),
            new Person("Isabella", "Johnson", "[email protected] /cdn-cgi/l/email-protection"),
            new Person("Ethan", "Williams", "[email protected] /cdn-cgi/l/email-protection"),
            new Person("Emma", "Jones", "[email protected] /cdn-cgi/l/email-protection"),
            new Person("Michael", "Brown", "[email protected] /cdn-cgi/l/email-protection")
        );

    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<Person, String> firstNameCol = new TableColumn<>("First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory<>("firstName"));

        TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");
        lastNameCol.setMinWidth(100);
        lastNameCol.setCellValueFactory(
                new PropertyValueFactory<>("lastName"));

        TableColumn<Person, String> emailCol = new TableColumn<>("Email");
        emailCol.setMinWidth(200);
        emailCol.setCellValueFactory(
                new PropertyValueFactory<>("email"));

        table.setRowFactory(tableView -> {
            final TableRow<Person> 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);
        }
    }
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 JavaFX TableView 中的行悬停时发生某些事情? 的相关文章

随机推荐

  • jquery ui spinner 几分钟

    我尝试使用 jquery ui spinner 进行分钟输入 目前它的工作范围为 0 60 但我希望个位数为 00 01 09 两位数 根据the docs http api jqueryui com spinner option numb
  • 保存字体和颜色(delphi)

    我的系统允许用户更改多个表单上多个项目的颜色和字体 我需要一种方法来保存这些字体和颜色 我的系统使用 sql 所以有没有办法将它们保存在那里 或者有其他方法来保存它们 您可以创建第二个名为 users prefereces 的表 其中包含
  • 使用 SSMS 2016 时出错:对象无法从 DBNull 转换为其他类型

    任何人都可以解决这个问题 Windows 10 笔记本电脑上的 SQL Server Management Studio 2016 CTP3 13 0 900 73 对象资源管理器 gt 服务器 gt 数据库 gt 数据库 右键单击 属性
  • 无法将图像推送到 Amazon ECR - 失败并显示“没有基本身份验证凭据”

    我正在尝试将 docker 映像推送到 Amazon ECR 注册表 我正在使用 docker 客户端 Docker 版本 1 9 1 构建a34a1d5 I use aws ecr get login region us east 1获取
  • ipython 安装新模块

    我已经习惯了安装软件包的 R 功能 并且我正在尝试使用 R 来做同样的事情ipython 有时以下方法有效 但有时又无效 我想最终找出为什么它只有效一半的时间 通常要安装一个模块 比如requests例如 我会在打开新终端后输入以下内容 s
  • UICollectionView 不会在 RTL 中从右到左填充数据

    我有一个UICollectionView并想要水平显示单元格 例如 用英语 它应该显示 细胞A 细胞B 细胞C 阿拉伯语 它应该显示 细胞C 细胞B 细胞A 对于 RTL UICollectionViewFlowLayout如果每个单元格大
  • PO 文件本地化未按数据注释的预期工作

    我在我的 asp net core 应用程序中使用了 Orchard Localization 启动 cs services AddPortableObjectLocalization options gt options Resource
  • 谷歌应用程序脚本是同步的吗?

    我是一名 Java 开发人员 同时学习 JavaScript 和 Google Apps 脚本 作为新手 我学习了 JavaScript 的语法 而不是它实际上是如何工作的 我很高兴地使用 Google Apps 脚本并按顺序和同步编写代码
  • Ember.JS 中的动态计算属性已弃用?

    我正在尝试制作一个 ember 应用程序 我有一个计算属性 控制器如下所示 The Controller Todos Controller Ember Controller create SNIP countCompleted functi
  • “eval() uating”条件的替代方法

    在我正在处理的遗留代码库中 有一个条件评估器 它接受用户输入来构建条件 然后使用 php eval 在运行时评估此条件 在不使用 eval 的情况下解决此问题的最佳方法是什么 例如我有一个用户在 UI 中输入的条件 1 gt 0 必须对此进
  • 使用 VBA 从 Excel 工作表更新 SQL

    我正在尝试使用 VBA 从 Excel 工作表更新 SQL 中的一些记录 我在 Excel 工作表中有很多记录 所以这就是为什么我想自动化这一点 以下是我要更新 rmn dr 的字段示例 t id 在两个表中都是唯一的 我想使用 Excel
  • ADB 没有响应 - Android Studio

    不要将其标记为重复项 让我解释一下出了什么问题并告诉你我做了什么 所以这是我的问题 当我打开 Android Studio 时 它给我一个错误 如下所示 然后我进入我的 Windows 防火墙设置 这是我所拥有的 如您所见 防火墙已关闭 然
  • 工作节点组未加入 EKS 集群

    我按照这个博客在 AWS 上设置了 open5GS https aws amazon com blogs opensource open source mobile core network implementation on amazon
  • 为什么 simplexml_load_file 相对于主机文件不起作用?

    I have simplexml load file指令放置在包含的 PHP 文件中 但该指令的工作原理取决于我包含此文件的位置 为什么 是否可以相对于放置的文件指令解释相对文件路径 您始终可以使用魔法访问当前文件的完整路径 FILE ht
  • partial_fit Sklearn 的 MLPClassifier

    我一直在尝试使用Sklearn的神经网络MLPClassifier 我有一个大小为 1000 个实例的数据集 具有二进制输出 我想对其应用带有 1 个隐藏层的基本神经网络 问题是我的数据实例并非同时可用 在任何时间点 我只能访问 1 个数据
  • Erlang 进程与 Java 线程

    我在读Sa a Juri 所著的 Elixir in Action 一书 第一章 https manning content s3 amazonaws com download b b915834 e80b 4520 939d ff1900
  • Delphi 中的嵌套属性

    Delphi 有没有办法使用嵌套属性 目前我正在使用Delphi XE 例如 TCompoundAttribute class TCustomAttribute public constructor Create A1 A2 TCustom
  • 有没有办法在函数运行完成后运行其他函数?

    def foo pass def bar print good bay 两个功能如打击 现在我想在 foo run 完成后运行 bar 函数 有没有类似类使用的方法 del 据我所知 在课堂方法中我可以使用 del 就像下面这样 class
  • 在表中存储/检索数组的最佳方法

    我目前在 MySQL 中有一个表可以正常存储值 但我想向该表添加一个字段来存储值数组 例如城市 我应该简单地将该数组存储为 CSV 吗 每行都需要它自己的数组 因此我对创建一个新表并为前一个表中插入的每行插入 2 5 行感到不安 我觉得这种
  • 如何在 JavaFX TableView 中的行悬停时发生某些事情?

    现在 当在表格视图中选择一行时 我会在鼠标位置显示对话框 我希望当我将鼠标悬停在每一行上时显示对话框 似乎有一个 CSS hover 所以我认为它可以以某种方式在 java 代码中捕获 您可以创建一个自定义表行工厂 它将侦听器添加到行的悬停