在单击或悬停等时获取网格窗格对象中的单元格位置



我有用于创建日历的 GridPane。 当我将鼠标悬停在任何日历单元格上时,我想获取该特定单元格的位置。

最终目标是使用该单元的位置访问其子单元并对其执行操作。我想做的一件具体的事情是创建自定义(非 JavaFX(工具提示,并将其在场景图中的位置移动到该悬停单元格的位置。

到目前为止,我所处的位置

在我看来,知道鼠标悬停在哪个单元格上是没有意义的。相反,您应该将每个单元格的内容转换为某种可重用的控件。

例:

public class CellControl extends BorderPane {
// Your UI logic
// Getters for data
public final LocalDate getDate() {
return date;
}
}
ObservableList<CellControl> cells = FXCollections.observableArrayList(cell -> new Observable[] {cell.hoverProperty()});
ObjectProperty<CellControl> hoveredCell = new SimpleObjectProperty<CellControl>() {
@Override protected void invalidated() {
// Do something
}
};
hoveredCell.bind(Bindings.createObjectBinding(
() -> cells.stream().filter(CellControl::isHover).findAny().orElse(null)
, cells));

GridPane.getRowIndexGridPane.getColumnIndex可用于确定行/列。

假设您不移动单元格,只需使索引/单元格本身可供侦听器使用通常更简单:

@Override
public void start(Stage primaryStage) {
GridPane root = new GridPane();
int row = 0;
int column = 0;
for (int i = 0; i < 30; i++) {
Text text = new Text(Integer.toString(i + 1));
StackPane cell = new StackPane(text);
cell.setStyle("-fx-background-color: lightblue; -fx-border-width: 2; -fx-border-color: black; -fx-border-style: solid");
cell.setMinSize(50, 50);
root.add(cell, column, row);
final int rowFinal = row;
final int columnFinal = column;
cell.setOnMouseEntered(evt -> {
System.out.format("column=%d; row=%d; cell=%sn", columnFinal, rowFinal, cell);
text.setText(text.getText() + "*");
});
cell.setOnMouseExited(evt -> {
String s = text.getText();
text.setText(s.substring(0, s.length() - 1));
});
column++;
if (column == 7) {
column = 0;
row++;
}
}
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}

最新更新