При добавлении второго элемента в мою область стека первый элемент теряет свой Event / MouseOn. Зачем? Как я могу исправить? JavaFX - PullRequest
5 голосов
/ 28 марта 2012

У меня есть стеке. Когда я добавляю второй элемент в свою панель стека, появляются оба, но я больше не могу щелкнуть свой первый элемент. Становится «неуправляемым».

То, что я определил в моем .setonmouse, не работает. Это работает для моего второго пункта. Если я переключу порядок, в котором они находятся на панели стека, другой работает, но не оба.

есть ли исправление для этого? Вот как выглядит моя программа:

Я хочу, чтобы моя «сетка» была в центре ВСЕГДА. В столбце слева расположены кнопки по центру, позже будут справа кнопки, а в верхней части сетки будут кнопки / Текст, а в дальнейшем и на полях.

Я хочу, чтобы все было кликабельно.

http://img688.imageshack.us/img688/6025/examplerg.png

Ответы [ 2 ]

4 голосов
/ 11 января 2014

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

Вот пример кода ... этот примерустанавливает 4 панели в стеке, и только основная панель принимает щелчки для начала.

StackPane rootPane = new StackPane();
VBox mainPane = new VBox(80);

BorderPane helpOverlayPane = new BorderPane();
helpOverlayPane.setMouseTransparent(true);

Canvas fullScreenOverlayCanvas = new Canvas();
fullScreenOverlayCanvas.setMouseTransparent(true);

VBox debugPane = new VBox();
debugPane.setAlignment(Pos.BASELINE_RIGHT);
AnchorPane debugOverlay = new AnchorPane();
debugOverlay.setMouseTransparent(true);
debugOverlay.getChildren().add(debugPane);
AnchorPane.setBottomAnchor(debugPane, 80.0);
AnchorPane.setRightAnchor(debugPane, 20.0);

rootPane.getChildren().addAll(mainPane, fullScreenOverlayCanvas, debugOverlay, helpOverlayPane);

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

fullScreenOverlayCanvas.setMouseTransparent(false);
debugOverlay.setMouseTransparent(true);
fullScreenOverlayCanvas.setVisible(true);

doSomethingWithCanvasThatNeedsMouseClicks();

PS Я немного отредактировал код, который у меня был, поэтому он может не работать как есть.Также см. Обсуждение вопроса о том, как сделать прозрачными только части панелей: JavaFX Передача событий Mouse через прозрачный узел дочерним элементам

4 голосов
/ 28 марта 2012

StackPane заказывает элементы в Z-порядке: последний выше первого. Таким образом, ваш второй элемент выполняет все щелчки мышью, а первый (покрываемый вторым) ничего не получает.

Для макета, который вы описали, вы можете использовать BorderPane:

public void start(Stage stage) throws Exception {
    BorderPane root = new BorderPane();
    root.setCenter(new Rectangle(100,100, Color.RED));
    root.setLeft(new Rectangle(10,10, Color.BLUE));
    root.setRight(new Rectangle(10,10, Color.CYAN));

    stage.setScene(new Scene(root,300,300));

    stage.show();
}
...