我有用于创建日历的GridPane。 当我将鼠标悬停在任何日历单元上时,我想获取该特定单元的位置。
最终目标是使用该单元的位置访问其子项并对其执行操作。我想做的一件事是创建一个自定义(非JavaFX)工具提示,并将其在场景图中的位置移动到该悬停单元格的位置。
答案 0 :(得分:0)
我认为,了解鼠标悬停在哪个单元上没有任何意义。相反,您应该将每个单元格的内容放入某种可重用的控件中。
示例:
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));
答案 1 :(得分:0)
GridPane.getRowIndex
和GridPane.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=%s\n", 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();
}