JavaFX TableView:单击时打开行之间的详细信息

2023-12-20

我正在尝试在 TableView 中显示旅行连接。到目前为止,这就像一个魅力。现在,我有点陷入尝试获取要在表行之间显示的连接的详细信息。这应该在选择表项时发生。

问题是,详细信息的格式与我显示的连接的格式不同。所以我需要在两个表格行之间放置一个面板。这是可能吗?


执行此操作的“正确”方法是创建自定义皮肤TableRow并使用rowFactory在返回的表上TableRow安装了自定义皮肤。然而,由于皮肤类在撰写本文时还不是公共 API(请注意,它们将在 Java 9 中),这意味着完全从头开始实现皮肤类(布置表格单元格等),这会很漂亮难的。

一种不太“官方”的方法,但更容易一点,就是重写TableRow直接,并挂钩到超类实现。

这可行,但感觉有点脆弱:

import java.util.Random;
import java.util.function.Function;

import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TableWithCustomRow extends Application {

    @Override
    public void start(Stage primaryStage) {
        TableView<Item> table = new TableView<>();

        table.setRowFactory(tv -> new TableRow<Item>() {
            Node detailsPane ;
            {
                selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
                    if (isNowSelected) {
                        getChildren().add(detailsPane);
                    } else {
                        getChildren().remove(detailsPane);
                    }
                    this.requestLayout();
                });
                detailsPane = createDetailsPane(itemProperty());
            }

            @Override
            protected double computePrefHeight(double width) {
                if (isSelected()) {
                    return super.computePrefHeight(width)+detailsPane.prefHeight(getWidth());
                } else {
                    return super.computePrefHeight(width);
                }
            }

            @Override
            protected void layoutChildren() {
                super.layoutChildren();
                if (isSelected()) {
                    double width = getWidth();
                    double paneHeight = detailsPane.prefHeight(width);
                    detailsPane.resizeRelocate(0, getHeight()-paneHeight, width, paneHeight);
                } 
            }
        });

        Random random = new Random();
        for (int i = 1 ; i <= 100 ; i++) {
            table.getItems().add(new Item("Item "+i, random.nextInt(100)));
        }
        table.getColumns().add(column("Item", Item::nameProperty));
        table.getColumns().add(column("Value", Item::valueProperty));

        Scene scene = new Scene(table, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private Node createDetailsPane(ObjectProperty<Item> item) {
        BorderPane detailsPane = new BorderPane();
        Label detailsLabel = new Label();
        VBox labels = new VBox(5, new Label("These are the"), detailsLabel);
        labels.setAlignment(Pos.CENTER_LEFT);
        labels.setPadding(new Insets(2, 2, 2, 16));
        detailsPane.setCenter(labels);

        Label icon = new Label("Icon");
        icon.setStyle("-fx-background-color: aqua; -fx-text-fill: darkgreen; -fx-font-size:18;");
        BorderPane.setMargin(icon, new Insets(6));
        icon.setMinSize(40, 40);
        detailsPane.setLeft(icon);

        detailsPane.setStyle("-fx-background-color: -fx-background; -fx-background: skyblue;");

        item.addListener((obs, oldItem, newItem) -> {
            if (newItem == null) {
                detailsLabel.setText("");
            } else {
                detailsLabel.setText("details for "+newItem.getName());
            }
        });


        return detailsPane ;
    }

    private static <S,T> TableColumn<S,T> column(String title, Function<S, ObservableValue<T>> property) {
        TableColumn<S,T> col = new TableColumn<>(title);
        col.setCellValueFactory(cellData -> property.apply(cellData.getValue()));
        col.setPrefWidth(150);
        return col ;
    }

    public static class Item {
        private final StringProperty name = new SimpleStringProperty() ;
        private final IntegerProperty value = new SimpleIntegerProperty() ;

        public Item(String name, int value) {
            setName(name);
            setValue(value);
        }

        public final StringProperty nameProperty() {
            return this.name;
        }


        public final java.lang.String getName() {
            return this.nameProperty().get();
        }


        public final void setName(final java.lang.String name) {
            this.nameProperty().set(name);
        }


        public final IntegerProperty valueProperty() {
            return this.value;
        }


        public final int getValue() {
            return this.valueProperty().get();
        }


        public final void setValue(final int value) {
            this.valueProperty().set(value);
        }



    }

    public static void main(String[] args) {
        launch(args);
    }
}

这给出了以下内容:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX TableView:单击时打开行之间的详细信息 的相关文章

  • 如何从表列javafx中删除行

    这些是我的表格列 Course and 描述 如果单击一行 该行变为 活动 突出显示 并且他们按下Delete按钮它应该删除该行 我该怎么做 我的代码Course列 以及我要添加什么事件侦听器到我的delete按钮 SuppressWarn
  • JavaFX 打印自定义纸张尺寸

    在 JavaFX 中 我想将照片打印到 10x15 的纸张上 有一些纸张常数 但没有 100x150 mm 常数 是否可以创建自己的纸张以在页面布局中使用它 Thanks PageLayout pageLayout printer crea
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 在JavaFX中如何在表视图中添加带有数据的组合框

    我已经尝试了很多 但无法将数据库中的所有值填充到我的组合框表格单元格中 控制器 java public class controller GetConnection gc new GetConnection PreparedStatemen
  • 错误:无法初始化主类 FileChooser_1 原因:java.lang.NoClassDefFoundError:阶段 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在这里编写了以下代码 我无法运行该程序 并且不断出现下面提到的错误 我尝试了很多可能的解决方案 但都是徒劳 import java
  • 如何使用 JRE 部署 JavaFX 11 桌面应用程序

    我有一个 JavaFX JDK 8 桌面业务应用程序 它使用 Java Web Start 进行部署 用户安装了 Java 8 只需访问 URL 我的 AWS Linux 服务器上的公共 URL 即可下载 启动应用程序 使用 Web Sta
  • 无法将 intellij 的 scenebuilder 与 jfoenix 一起使用

    我使用 java 9 0 4 创建了一个 javafx 项目 该代码可以编译并运行 我可以使用内部场景构建器 但是当我从 Jfoenix 9 0 1 库导入元素时 我无法再使用 sceneBuilder 我收到此错误 java lang U
  • 当线程完成这项工作时,我是否需要使用 JavaFX 中的线程和任务在后台运行某些内容?

    我正在使用一个线程定期运行三秒的背景动画 我改编了用 Swing 编写的线程演示示例中的相关代码并使用 它取代了一个不太工作的早期版本 该版本同时使用了线程和任务 我的程序在播放视频或运行动画时停止 挂起线程 并在结束视频或动画时启动新线程
  • 更改在不同场景中输入的新场景中的标签文本(javafx)

    我正在尝试更改标签中的文本 该文本是在不同场景的文本字段中输入的文本 我制作了 2 个 FXML 文件 第一个包含一个文本字段和 确定 按钮 第二个包含一个标签 带有文本 标签 我的目标是在文本字段中输入文本 当我按 确定 gt 打开新场景
  • ObservableList 不更新 ArrayList

    对于学校作业 我们正在使用 JavaFX 中的 ObservableList 对象 对吗 我已经为此工作了一天多了 但无法弄清楚 老师只告诉我们 谷歌一下 所以这也没有帮助 基本上 我们正在开发一个基本的管理应用程序来跟踪人们及其家人 人们
  • 如何调整Javafx未装饰阶段的大小?

    我是JavaFX技术的新手 目前我正在开发javafx应用程序 其中有未装饰的阶段 我能够使用下面的代码将其移动到屏幕上 但我是无法从右下角调整此窗口的大小 任何人都可以建议我解决方案 public void loadPanel final
  • JavaFX - 如何从另一个控制器使用一个控制器中的方法?

    使用场景构建器 我有 2 个阶段 每个阶段都有一个控制器 stage1Controller stage2Controller Stage1控制器 public class Stage1Controller FXML private Menu
  • JavaFX TabPane 禁用按键切换选项卡

    我有一个Tab有一些内容 ScrollBar和别的 The ScrollBar has event handler for keys left and right 但如果我按下这些按钮Tabs被切换 因为TabPane还有一个密钥处理程序
  • 将TableView数据显示到另一个窗口中包含JavaFx中的TextField

    我制作了两个 Fxml 文件 一个包含 TextField 另一个包含 TableView 它有它的 Controller 类 我想在执行鼠标单击操作事件时显示从 TableView 到 TextField 的数据 但我们没有得到结果 它显
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • JavaFX ImageView 未更新

    因此 我尝试将图像加载并保存到 imageView 中 其中图像的位置是通过文件浏览器选择的 我已经为此工作好几天了 如果我不能解决这个问题 我就会中风 我已经尝试了我能想到的一切 预先感谢您的帮助 UPDATED 这是我的主要课程 pub
  • 如何强制 JavaFX 字体抗锯齿?

    在测试 JavaFX 8 应用程序的 GUI 时 我注意到某些标签不显示抗锯齿文本 经过一番谷歌搜索和挣扎后 我发现正在发生一件非常烦人的事情 抗锯齿仅应用于字体大小大于 80 像素的标签 下面是一个比较应用了 AA 的 JavaFX 和
  • Raspberry PI 上的 JavaFX:加载库存着色器时出错

    目前我正在尝试部署我的 JavaFX 应用程序 该应用程序可以在 Windows 上的 Raspberry Model B v1 2 上顺利运行 由于 JavaFX 不能直接在 Raspi 上使用 我已经按照此处所述使用 Gluon 进行了
  • JavaFX:在 WebView img 标签中未加载本地图像

    以下是我的代码 一切安好 我可以加载远程页面 我可以放置 HTML 内容 但我的img标签显示一个X标志表示无法加载图像 Note 我的图像与类位于同一个包中JavaFX在 Smiley 文件夹中 我可以列出所有图像 这意味着路径没有问题

随机推荐

  • 使用 REST API 访问 Kubernetes API

    我正在尝试从 NodeJS 访问 Kubernetes API 在没有 kubectl 或 gcloud 命令行工具可用的环境中运行 使用https github com kubernetes client javascript https
  • java.lang.RuntimeException:错误:03000068:bignum例程:OPENSSL_internal:CALLED_WITH_EVEN_MODULUS

    我想在android中使用公钥和私钥实现RSA加密 我所做的实现如下 public static String enccriptData String dataToEncrypt try String publicExponentStrin
  • Python Pandas 十进制标记欧盟到美国

    我红色了有关欧盟到美国十进制标记转换的邮件 这些帮助很大 但我仍然觉得需要专家的一些帮助 我的数据来自 ERP 系统 数字格式为 1 000 000 32 我只想转换成类似 1000000 32 的东西 以便在 Pandas 中进一步处理
  • 动态 SQL 有哪些危险以及可以避免吗?

    我们刚刚收到以下代码 作为离岸开发商提供的新应用程序中复杂搜索查询的解决方案 我对动态 SQL 的使用持怀疑态度 因为我可以使用 关闭 SQL 语句 然后执行一个将在数据库上执行的令人讨厌的操作 关于如何修复注入攻击有什么想法吗 ALTER
  • 我们如何在没有源代码的情况下调试签名的 apk?

    我想问是否有可能在没有源代码的情况下调试发布的 apk 以及我们如何阻止用户执行此操作 我认为如果没有源代码我就无法调试apk 默认情况下清单有安卓 可调试 假 直到我将其发送给客户 他要求我禁用可调试模式 因为他遇到了这个问题 我尝试重现
  • Django South:更改数据迁移中的字段类型

    我正在更改一个字段CharField to IntegerField 字段名称保持不变 新创建的字段将基于旧字段 例如 如果旧字段是 L 则它将改为数字 1 我怎样才能在forwards 功能 正确的方法是将其分为三个迁移 第一次架构迁移以
  • 将包含数字的字符串解析为整数数组

    给出一个字符串作为由数字组成的输入 我想将其转换为 C 中的整数数组 include
  • Android:java.lang.RuntimeException:takePicture 失败

    我正在尝试在 SurfaceView 的 ontouchevent 中捕获图像 但是 每次触摸屏幕时 应用程序都会崩溃 并出现以下异常 01 05 21 03 18 500 ERROR AndroidRuntime 10367 FATAL
  • Turbomail 与 Pyramid 集成

    我需要一种从金字塔应用程序发送电子邮件的方法 我知道金字塔邮件程序 http docs pylonsproject org projects pyramid mailer en latest 但它的消息类别似乎相当有限 我不明白是否可以使用
  • 如何使图像旋转(动画)

    我有一个正方形的图像 我知道如何让它旋转 但不知道如何让它像这个动画一样旋转 注意它是如何旋转的 然后稍微停下来 然后再次旋转 等等 我所拥有的只是一个基本的旋转 但看起来不像上面的 gif extension UIView func ro
  • 当management.port与服务器端口不同时,如何调用OncePerRequestFilter?

    我有一个可以延伸的过滤器OncePerRequestFilter 当我management port 8081和server port 8080 或任何不同的端口 我的过滤器不会在任何 8081 URL 上调用 过滤器是only调用 808
  • 如何在Python中使用bzip2压缩文件?

    这是我所拥有的 import bz2 compressionLevel 9 source file foo bar txt this file can be in a different format like csv or others
  • 存储在文件中的序列化对象不可读

    问题是 当我将序列化对象存储在 txt 文件中时 它不是可读的形式 并且包含一些随机符号和字母 首先我想知道这背后的原因是什么 然后如何解决这个问题 好的 这是我的代码 我想要序列化的对象 package serialized import
  • 鼠标悬停在元素最左边 10px 处?

    当鼠标悬停在单元格最左边的 10 个像素上时 我需要更改表格单元格的颜色 目前我有这个 myTable table thead tr th nth child 3 mouseover function this css background
  • 使用 C# 将 JSON 字符串直接添加到 Azure Blob 存储容器

    我正在尝试加载 JSON 字符串 使用 Newtonsoft Json 序列化 无需创建临时文件 我使用返回字符串的 JsonConvert SerializeObject obj settings 在运行时序列化对象 按照微软文档 我可以
  • 为什么SGI STL不使用复制和交换习惯用法?

    我最近在 StackOverflow 上读到一个关于什么是复制和交换习语 https stackoverflow com questions 3279543 what is the copy and swap idiom并且知道复制和交换习
  • 并行调用数百个 azure 函数

    我有一个使用某些规则引擎执行规则的应用程序 我有大约 500 多个规则 我们的应用程序将收到大约 10 000 个条目 所有这 10 000 个条目都应该单独经过这 500 条规则进行验证 我们目前计划将所有规则迁移到 Azure 函数中
  • 发送数据时使用 POST 下载 R 中的文件

    我尝试下载一个文件 为了从服务器获取它 我需要同时发送数据 在命令行上使用curl 它可以正常工作 curl https www ishares com us product screener download dl data produc
  • R:使用 httr 模拟复杂形式

    我想得到的结果那种形式 http www memoiredeshommes sga defense gouv fr fr arkotheque client mdh base morts pour la france premiere gu
  • JavaFX TableView:单击时打开行之间的详细信息

    我正在尝试在 TableView 中显示旅行连接 到目前为止 这就像一个魅力 现在 我有点陷入尝试获取要在表行之间显示的连接的详细信息 这应该在选择表项时发生 问题是 详细信息的格式与我显示的连接的格式不同 所以我需要在两个表格行之间放置一