Получить местоположение ячейки в объекте GridPane при щелчке или наведении и т. Д. Javafx - PullRequest
0 голосов
/ 28 августа 2018

У меня есть GridPane, который я использую для создания календаря. Когда я наводю курсор мыши на любую из ячеек календаря, я хочу получить местоположение этой конкретной ячейки.

Конечной целью является использование местоположения этой ячейки для доступа к ее дочерним элементам и выполнения операций над ними. Одна конкретная вещь, которую я хочу сделать, - это создать настраиваемую (не JavaFX) подсказку и переместить ее положение в графе сцены в местоположение этой зависшей ячейки.

Вот где я сейчас нахожусь

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

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();
}
0 голосов
/ 28 августа 2018

По моему мнению, нет смысла знать, на какую клетку наведена ваша мышь. Вместо этого вы должны превратить содержимое каждой ячейки в некий элемент многократного использования.

Пример:

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));
...