Макет слоя в GlassPane не работает должным образом

Я установил слой в GlassPane вот так:

MobileApplication.getInstance().getGlassPane().getLayers().add(myLayer);

Теперь я ожидаю, что содержимое myLayer будет выровнено по центру GlassPane, как это происходит, когда я добавляю слой в View:

view.getLayers().add(myLayer)

Хотя выравнивание установлено по центру, я получаю следующий результат:

введите здесь описание изображения

Я заметил, что все layoutBounds слоя, добавленного в GlassPane, равны «0», а layoutBounds слоя в представлении идентичны макету layoutBounds.

Кроме того, мне не нужно вызывать layer.show(), как указано в документации по глюону ("Отображение слоя затем достигается либо вызовом show(),..."), потому что слой отображается сразу после его добавления к слою.

Я что-то упускаю?


person jns    schedule 03.04.2016    source источник


Ответы (1)


Предлагаю ознакомиться с подробной документацией здесь, а не только с JavaDoc .

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

Предпочтительным способом является использование addLayerFactory(), например:

@Override
public void init() {
    addViewFactory(BASIC_VIEW, () -> new BasicView(BASIC_VIEW));

    addLayerFactory("My Layer", () -> new SidePopupView(new StackPane(new Button("Side"))));
}

Слой будет скрыт, если вы не покажете его с помощью MobileApplication.getInstance().showLayer("My Layer").

Вы можете создать свою собственную реализацию Layer, например:

private class MyLayer extends Layer {

    private final Node root;
    private final double size = 150;

    public MyLayer() {
        root = new StackPane(new Button("A custom layer"));
        root.setStyle("-fx-background-color: white;");
        getChildren().add(root);
        getGlassPane().getLayers().add(this);
    }

    @Override
    public void layoutChildren() {
        root.setVisible(isShowing());
        if (!isShowing()) {
            return;
        }
        root.resize(size, size);
        resizeRelocate((getGlassPane().getWidth() - size)/2, (getGlassPane().getHeight()- size)/2, size, size);
    }
}

и добавьте его также к фабрике:

addLayerFactory("My Layer", () -> new MyLayer());

Но обратите внимание, что вам придется изменить его размер и переместить, иначе вы получите местоположение 0,0, как на картинке, и позаботьтесь о его видимости.

Или вы можете использовать встроенные слои, такие как SidePopupView, и вам не нужно будет беспокоиться об этих низкоуровневых деталях.

person José Pereda    schedule 03.04.2016
comment
Именно то, что я искал. Очень признателен! (Мне нужен был Layer для пользовательского ProgressIndicator, и я не смог найти подходящий в библиотеке Charm) - person jns; 04.04.2016