2016-04-03 5 views
1

я установил слой в GlassPane подобное:Компоновка слоя в GlassPane не работает, как ожидалось

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

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

view.getLayers().add(myLayer) 

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

enter image description here

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

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

Я что-то упустил?

ответ

0

Предлагаю вам ознакомиться с подробной документацией here, а не только с 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, и вам не нужно будет беспокоиться об этих деталях более низкого уровня.

+0

Именно то, что я искал. Очень признателен! (Мне нужен «Layer» для пользовательского ProgressIndicator и не нашел подходящего в Charm lib) – jns