在 JavaFX 应用程序中聚焦 TableView 或 TreeView 时,第一行始终被选中

2024-03-13

我意识到 JavaFX 应用程序中的所有 tableView 和 treeView 在获得焦点后都会选择第一行。因此,即使我单击相应的滚动条,也会选择第一行。既然我当然不想有这样的行为,我想问一下,是否有办法避免这种行为?

编辑:我添加了一个简单的示例,它创建了两个简单的列表。在这里,只要单击空行,就会选择第一行。

编辑2:在代码中添加了两个小侦听器,以便在不重新启动应用程序的情况下可以重复问题。

package testlistview;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class TestListView extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        HBox root = new HBox();
        root.setSpacing(10);

        Scene primaryStageScene = new Scene(root);
        primaryStage.setScene(primaryStageScene);

        ListView<String> l1 = new ListView();
        l1.getItems().addAll("a", "b", "c", "d", "e", "f", "g");
        ListView<String> l2 = new ListView();
        l2.getItems().addAll("1", "2", "3", "4", "5", "6", "7");
        root.getChildren().addAll(l1, l2);

        l1.setOnMouseClicked((MouseEvent e) -> {
            l2.getSelectionModel().clearSelection();
        });

        l2.setOnMouseClicked((MouseEvent e) -> {
            l1.getSelectionModel().clearSelection();
        });

        primaryStage.show();
    }
}

编辑3:我意识到当我对表进行排序时,第一行也会被选中。然而,为了避免这种情况,我创建了一个小 hack(这可能是一个非常糟糕的风格,但它现在有效)。

  private boolean sorted = false;

// (...)

    tableView.addEventFilter(MouseEvent.MOUSE_PRESSED,
                            new EventHandler<MouseEvent>() {
                                public void handle(MouseEvent e) {
                                    if (!tableView.isFocused()) {
                                        if (e.getPickResult().getIntersectedNode() instanceof Label) {
                                            sorted = true;
                                        }

                                    }
                                }
                            ;
                    });

    tableView.focusedProperty().addListener((a,b,c) -> {
                if(!tableView.isPressed() || sorted) {
                    tableView.getSelectionModel().clearSelection();
                    sorted = false;
                }
            });

所以这里 eventFilter 在监听器之前被激活。据我所知,只有标题是实例标签。因此,每次首先单击标题时,选择都会被清除。

然而,正如下面的帖子中所讨论的,我猜这个错误将在下一个 java 版本中消失。


我有同样的问题。发现这个答案非常有帮助:

如何使 JavaFX 列表视图中的前 2 行不可选择 https://stackoverflow.com/questions/26521658/how-to-make-the-first-2-rows-in-a-javafx-listview-non-selectable

根据您使用的 jdk8 的确切(更新)版本,这可能是 RT-25679 的修复(在 RT-38517 中部分恢复)AFAIK,没有公共 api 来禁用集合视图的自动聚焦/选择一般来说。只有 ListView 在其属性中具有禁用默认行为的条目(未记录!请注意,它们可以在不通知的情况下进行更改)

// disable selecting the first item on focus gain - this is
// not what is expected in the ComboBox control (unlike the
// ListView control, which does this).
listView.getProperties().put("selectOnFocusGain", false);
// introduced between 8u20 and 8u40b7
// with this, testfailures back to normal
listView.getProperties().put("selectFirstRowByDefault", false);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JavaFX 应用程序中聚焦 TableView 或 TreeView 时,第一行始终被选中 的相关文章

  • jquery UI datepicker - 禁用日期范围

    我正在努力让某些东西正常工作 我遇到了 未捕获的类型错误 无法读取未定义的属性 0 错误 如下所示 我不明白为什么 我正在尝试在度假别墅网站上使用 jQuery UI 日期选择器来指示可用性和季节 低 高等 我有一个作为 datePicke
  • 无法启动使用 Apache POI 的 JavaFX 应用程序

    我有一个按预期工作的 JavaFX 应用程序 我需要使用 Apache POI 来读取和写入 excel 文件 以下是我已采取的步骤 添加了所需的依赖 implementation org apache poi poi ooxml 5 2
  • 如何在 JavaFX 中对单选按钮的最大可选复选框进行限制?

    请看下面的图片 您就会了解我的应用程序的布局 我希望能够动态选择多少CheckBox 启用下拉菜单 是可选的 固定数量 我想用这 3 个人来实现这个目标RadioButton 在垂直模式下全部 4CheckBox必须选择 不少于 在混合模式
  • JavaFx GridPane布局如何为行中的元素设置边距?

    我正在使用 GridPane 布局在我的应用程序中定位事物 我想知道如何为 row 中的元素设置边距 GridPane setConstraints chip5 1 1 1 1 HPos RIGHT VPos TOP I want to s
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 没有 GUI 的 Android Activity

    我创建了一个仅从链接启动的活动 使用意图过滤器 我不希望此活动有 GUI 我只希望它启动服务并在栏中放置通知 我尝试将链接的意图过滤器放入我的服务中 但这不起作用 有没有更好的方法可以响应意图过滤器 或者我可以让我的活动没有 GUI 吗 抱
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • 绘制圆和连接这些圆的曲线

    我需要绘制一些圆圈和连接这些圆圈的曲线 圆圈必须以行和列的方式绘制 所以我想使用 GridPane 将是一个不错的选择 但是 绘制完所有圆圈后 如何添加曲线来连接属于此 GridPane 上不同列的圆圈 我无法将 GridPane add
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • JavaFX ImageView 未更新

    因此 我尝试将图像加载并保存到 imageView 中 其中图像的位置是通过文件浏览器选择的 我已经为此工作好几天了 如果我不能解决这个问题 我就会中风 我已经尝试了我能想到的一切 预先感谢您的帮助 UPDATED 这是我的主要课程 pub
  • html 选择列表 - 通过传入变量获取文本值?

    我有一个显示列表语言的选择列表
  • 有没有办法将应用程序覆盖在全屏程序上?

    我希望开发一个应用程序 它本质上是一个计时器窗口 它始终显示在任何其他应用程序前面的屏幕上 并且在聚焦其他窗口时永远不会落入背景 一个例子是 当我玩全屏游戏时 我希望这个计时器覆盖游戏 并且当我单击窗口上的计时器按钮时 它不会关闭游戏 我有
  • 为什么我的项目没有显示在 JFrame 中?

    我对 JFrame 相当陌生 我想知道为什么我的项目没有显示在窗口上 我知道我没有 ActionHandler 但我只想让我的文本字段显示在我的窗口上 这是我的代码 import java awt Font import javax swi
  • 在单个 select 语句中多次有条件地求和同一列?

    我有一个表 显示每个月在给定位置的各种类型的部署的员工部署情况 ID Location ID Date NumEmployees DeploymentType ID 例如 一些记录可能是 1 L1 12 2010 7 1 Permanent
  • Java - 直观地拖动摆动元素

    有没有类似的解决方案http allen sauer com com allen sauer gwt dnd demo DragDropDemo DragDropDemo html PaletteExample http allen sau
  • 与保留模式 GUI 相比,使用立即模式 GUI 对性能有何影响?

    我目前正在开发一个标准的 Windows 桌面应用程序 标准意味着没有花哨的东西 只是按钮 文本 滑块等 在研究了一些 GUI 框架并被拒绝后 我决定自己编写一个 GUI 框架他们全部 由于这是一个业余爱好项目 我也愿意尝试 并决定将 GU
  • 使用 JavaFX 和 Maven 将模块描述符添加到库中[重复]

    这个问题在这里已经有答案了 我需要使用反思 https github com ronmamo reflections在一个带有 JavaFX 的 Maven 项目中 我想使用jlink捆绑一个最小的 JRE 问题是我运行时出现以下错误mvn
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline

随机推荐