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

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

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

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

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

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

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


person CREW    schedule 27.03.2012    source источник


Ответы (2)


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();
}
person Sergey Grinev    schedule 28.03.2012

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

Вот некоторый пример кода... этот пример устанавливает 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);

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

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

doSomethingWithCanvasThatNeedsMouseClicks();

P.S. Я немного отредактировал код, который у меня был, поэтому он может не работать как есть. Кроме того, см. здесь обсуждение того, как сделать прозрачными только части панелей: через Прозрачный узел для детей

person yaraju    schedule 11.01.2014