我需要在默认列排序机制中添加更改,为此我需要在表名称列标题上使用鼠标事件.为此我使用nameColumn.addEventFilter(...).然而,当我单击名称列标题时,处理程序不会被调用.

我使用MEK 23-ea+3,这是我的代码:

public class JavaFxTest7 extends Application {

    private static class Student {

        private int id;

        private String name;

        private int mark;

        public Student(int id, String name, int mark) {
            this.id = id;
            this.name = name;
            this.mark = mark;
        }

        public int getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        public int getMark() {
            return mark;
        }
    }

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

    @Override
    public void start(Stage stage) {
        var table = this.createTable();
        var scene = new Scene(table, 300, 300);
        stage.setScene(scene);
        stage.show();
    }

    private TableView<Student> createTable() {
        var table = new TableView<Student>();
        table.getItems().addAll(new Student(1, "Billy", 3),
                new Student(2, "Johnny", 4), new Student(3, "Mickey", 5));
        var idColumn = new TableColumn<Student, Integer>("ID");
        idColumn.setCellValueFactory((data) ->  new ReadOnlyObjectWrapper<>(data.getValue().getId()));
        var nameColumn = new TableColumn<Student, String>("Name");
        nameColumn.setCellValueFactory((data) ->  new ReadOnlyStringWrapper(data.getValue().getName()));

        nameColumn.addEventFilter(javafx.scene.input.MouseEvent.MOUSE_CLICKED, (e) -> {
            System.out.println("Clicked on name column");
        });

        var markColumn = new TableColumn<Student, Integer>("Mark");
        markColumn.setCellValueFactory((data) ->  new ReadOnlyObjectWrapper<>(data.getValue().getMark()));
        table.getColumns().addAll(idColumn, nameColumn, markColumn);
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_FLEX_LAST_COLUMN);
        return table;
    }
}

有人能告诉我如何修复它吗?

推荐答案

我很确定TableColumn个对象只能提供edit events个对象. MouseEvents发生在Nodes上,因此您需要找到与您的表格列对应的 node .

JavaFX CSS Reference Guide记录了Table View的保证子 struct . 将存在具有CSS类table-columncolumn-header的后代 node . (为了简单起见,我假设您的表永远不会有嵌套列.)

您可以使用lookupAll方法来浏览具有这些CSS类的 node ,以定位与您的列对应的 node ,但由于表的 struct 可能要等到实现(即准备好显示)后才会构建,因此您应该在您的阶段显示后执行:

stage.setScene(scene);
stage.show();

EventHandler<MouseEvent> listener = e -> {
    System.out.println("Clicked on name column");
};

List<String> headerClasses = List.of("column-header", "table-column");
String headerSelector = ".column-header.table-column";

int nameColumnIndex = table.getColumns().indexOf(nameColumn);
for (Node column : table.lookupAll(headerSelector)) {
    List<Node> siblings = column.getParent().getChildrenUnmodifiable();

    // Not all siblings are table headers.
    List<Node> headers = new ArrayList<>(siblings);
    headers.removeIf(s -> !s.getStyleClass().containsAll(headerClasses));

    if (headers.indexOf(column) == nameColumnIndex) {
        column.addEventFilter(MouseEvent.MOUSE_CLICKED, listener);
        break;
    }
}

Java相关问答推荐

PostgreSQL货币兑换率查询

try Dockerize Maven应用程序,但发布版本21不支持"

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

存根基类的受保护方法

如何用内置Java从JavaFX应用程序中生成.exe文件?

Java堆中的许多java.time.ZoneRegion实例.ZoneId实例不应该被缓存吗?

Android Studio模拟器没有互联网

Spring Validator批注不起作用

在Spring Boot JPA for MySQL中为我的所有类创建Bean时出错?

何时调用密封层次 struct 的switch 中的默认情况

我的代码是线程安全的吗?[Java、CAS、转账]

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

将基于实例编号的对象列表拆分为新的对象列表

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

ResponseEntity.控制器截断响应的JSON部分

ANTLR 接受特殊字符,例如 .标识符或表达式中的(点)和 ,(逗号)

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?