单击或悬停等在GridPane对象中获取单元格位置。javafx

时间:2018-08-28 00:41:08

标签: javafx gridpane onhover

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

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

Here where I'm at so far

2 个答案:

答案 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.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=%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();
}