2016-04-03 1 views
1

J'ai installé une couche dans le GlassPane comme ça:Disposition de la couche dans GlassPane ne fonctionne pas comme prévu

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

Maintenant, j'attendre le contenu de myLayer à alligned dans le centre de la GlassPane comme il est quand J'ajoute une couche à View:

view.getLayers().add(myLayer) 

Bien que l'alignement est réglé sur le centre-je obtenir le résultat suivant:

enter image description here

J'ai remarqué que les layoutBounds de la couche ajoutée à glassPane sont tous "0", alors que les layoutBounds de la couche en vue sont identiques aux layoutBounds de vue.

De plus, je n'ai pas besoin d'appeler layer.show() comme indiqué dans la documentation de gluon ("Montrer un calque est alors obtenu soit en appelant show(), ..."), car le calque est immédiatement affiché après son ajout à une couche.

Ai-je raté quelque chose?

Répondre

0

Je suggère que vous jetez un oeil à la documentation détaillée here, et pas seulement à la JavaDoc.

Vous y trouverez une explication plus détaillée sur la manière d'ajouter et de créer des calques.

La façon préférée est à l'aide addLayerFactory(), comme:

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

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

La couche sera masqué, à moins que vous le montrer avec MobileApplication.getInstance().showLayer("My Layer").

Vous pouvez créer votre propre implémentation Layer, comme:

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

et l'ajouter ainsi à l'usine:

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

Mais remarquez que vous devrez redimensionner et déplacer, sinon vous obtiendra 0,0 emplacement comme dans votre image, et prend soin de sa visibilité.

Ou vous pouvez utiliser des calques intégrés, comme SidePopupView, et vous n'aurez pas à vous soucier de ces détails plus bas niveau.

+0

Exactement ce que je cherchais. Très appréciée! (J'avais besoin d'un 'Layer' pour un ProgressIndicator personnalisé, et je ne pouvais pas trouver celui qui convenait dans la librairie Charm) – jns