package com.ecep.contract.util; import java.util.List; import java.util.Set; import java.util.function.Consumer; import org.springframework.data.domain.Sort; import javafx.scene.Node; import javafx.scene.control.TableColumn; import javafx.scene.control.TableRow; import javafx.scene.control.TableView; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseButton; import javafx.scene.input.PickResult; public class TableViewUtils { /** * 获取 Table 的排序 */ public static List getOrders(TableView table) { return table.getSortOrder().stream().filter(c -> { if (!c.isSortable()) { return false; } String id = c.getId(); return id.endsWith("Column"); }).map(c -> { String id = c.getId(); id = id.replace(table.getId() + "_", ""); id = id.replace("Column", ""); Sort.Direction dir = c.getSortType() == TableColumn.SortType.ASCENDING ? Sort.Direction.ASC : Sort.Direction.DESC; return new Sort.Order(dir, id); }).toList(); } @SuppressWarnings("unchecked") public static void bindDoubleClicked(TableView table, Consumer consumer) { table.setOnMouseClicked(event -> { if (event.getClickCount() == 2 && event.getButton() == MouseButton.PRIMARY) { PickResult pickResult = event.getPickResult(); Node intersectedNode = pickResult.getIntersectedNode(); if (intersectedNode instanceof TableRow) { // 鼠标点击的地方没有定义列,只返回了行,跳过不做处理 TableRow row = (TableRow) intersectedNode; row.getItem(); return; } T selectedItem = table.getSelectionModel().getSelectedItem(); if (selectedItem != null) { try { consumer.accept(selectedItem); } catch (UnsupportedOperationException e) { UITools.showExceptionAndWait("当前操作不支持", e); } catch (Exception e) { UITools.showExceptionAndWait(e.getMessage(), e); } } } }); } public static void bindEnterPressed(TableView table, Consumer consumer) { table.setOnKeyPressed(event -> { if (event.getCode() == KeyCode.ENTER) { T selectedItem = table.getSelectionModel().getSelectedItem(); if (selectedItem != null) { consumer.accept(selectedItem); } } }); } /** * 计算表格的可视行数 * * @param table 表格视图 * @param T * @return 可视行数 */ public static int getTableViewVisibleRows(TableView table) { int rows = 0; Set tableRow = table.lookupAll("TableRow"); for (Node node : tableRow) { if (node instanceof TableRow) { if (!node.isVisible()) { continue; } rows++; } } return rows; } }