2016-10-31 2 views
0

J'utilise le code suivant pour installer un Layer dans le GlassPane et le montrer:Gluon Charm 4.0.0 GlassPane n'est plus modal?

glassPane.getLayers().add(myLayer); 
MobileApplication.getInstance().addLayerFactory("myLayer",()-> myLayer); 

MobileApplication.getInstance().showLayer("myLayer"); 

Alors que sur la couche Charm 3.0.0 montrait modale au-dessus de la vue actuelle, sur Charm 4.0.0 la couche n'est pas modale plus. Donc, y at-il une fonction de construction pour le montrer de nouveau modal, ou devons-nous utiliser un EventFilter?

EDIT:

ProgressLayer complete code (pas adapté à Charm 4.0.0)

code simplifié de ProgressLayer:

public class ProgressLayer extends Layer { 

    private static final GlassPane GLASS_PANE = MobileApplication.getInstance().getGlassPane(); 
    private String layerName; 

    private StackPane    root; 
    private Circle     clip; 
    private double     size; 

    public ProgressLayer(Node icon, double radius, String layerName) { 
     setAutoHide(false); 
     this.layerName = layerName; 
     size = radius * 2; 

     ProgressIndicator progress = new ProgressIndicator(); 
     progress.setStyle("-fx-color:#ff9100"); 
     progress.setRadius(radius); 

     root = new StackPane(progress); 

     if (icon != null) { 
      icon.getStyleClass().add("progress-icon"); 

      clip = new Circle(radius-1); 
      icon.setClip(clip); 

      root.getChildren().add(icon); 
     } 

     getChildren().add(root); 
     GLASS_PANE.getLayers().add(this); 
    } 

    @Override 
    public void layoutChildren() { 
     root.setVisible(isShowing()); 
     if (!isShowing()) { 
      return; 
     } 

     root.resizeRelocate((GLASS_PANE.getWidth() - size)/2, (GLASS_PANE.getHeight() - size)/2, size, size); 
     if (clip != null) { 
      clip.setLayoutX(root.getWidth()/2 -1); 
      clip.setLayoutY(root.getHeight() /2 -1); 
     } 
    } 

    public void setOnCancelled(EventHandler<MouseEvent> handler) { 
     root.setOnMouseClicked(handler); 
    } 
} 

enter image description here

Tant que l'opération est En cours d'exécution, le progressLayer sera montré, et vous n'êtes pas capable d'interrompre l'opération ou masquer la couche, à moins que vous appuyez sur l'icône violet au centre:

progressLayer.setOnCancelled(e -> hideLayer(progressLayer.getLayerName())); 

Et voici le problème. Lorsque root n'utilise pas la totalité de la taille d'écran, les contrôles d'interface utilisateur qui ne sont pas couverts par les boutons root comme par exemple. peut être activé. Ce comportement est en contraste avec Gluon Charm 3.0.0

Répondre

1

Avez-vous essayé myLayer.setAutoHide(false)?

Selon JavaDoc pour autoHideProperty():

indique si cette couche doit se cacher quand il est cliqué en dehors de ses limites - par défaut, ce qui est vrai.

EDIT

Ce petit projet qui fonctionne pour moi:

build.gradle

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'org.javafxports:jfxmobile-plugin:1.1.1' 
    } 
} 

apply plugin: 'org.javafxports.jfxmobile' 

repositories { 
    jcenter() 
    maven { 
     url 'http://nexus.gluonhq.com/nexus/content/repositories/releases' 
    } 
} 

mainClassName = 'com.testmodal.TestModal' 

dependencies { 
    compile 'com.gluonhq:charm:4.0.1' 
} 

jfxmobile { 
    downConfig { 
     version = '3.0.0' 
     plugins 'display', 'lifecycle', 'statusbar', 'storage' 
    } 
    android { 
     manifest = 'src/android/AndroidManifest.xml' 
    } 
    ios { 
     infoPList = file('src/ios/Default-Info.plist') 
     forceLinkClasses = [ 
       'com.gluonhq.**.*', 
       'javax.annotations.**.*', 
       'javax.inject.**.*', 
       'javax.json.**.*', 
       'org.glassfish.json.**.*' 
     ] 
    } 
} 

TestModal

public class TestModal extends MobileApplication { 

    public static final String BASIC_VIEW = HOME_VIEW; 
    public static final String BASIC_LAYER = "My Layer"; 

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

    @Override 
    public void postInit(Scene scene) { 
     Swatch.BLUE.assignTo(scene); 
     ((Stage) scene.getWindow()).getIcons().add(new Image(TestModal.class.getResourceAsStream("/icon.png"))); 
    } 

    class ProgressLayer extends Layer { 

     private final Node root; 

     public ProgressLayer(String layerName) { 
      setAutoHide(false); 

      ProgressIndicator progress = new ProgressIndicator(); 
      progress.setRadius(100); 

      root = new StackPane(progress); 
      getChildren().add(root); 
      getGlassPane().getLayers().add(this); 

      showingProperty().addListener((obs, ov, nv) -> { 
       if (nv) { 
        setBackgroundFade(0.5); 
        PauseTransition p = new PauseTransition(Duration.seconds(3)); 
        p.setOnFinished(e -> hideLayer(BASIC_LAYER)); 

        p.playFromStart(); 
       } 
      }); 
     } 

     @Override 
     public void layoutChildren() { 
      root.resize(getGlassPane().getWidth(), getGlassPane().getHeight()); 
     } 
    } 
} 

BasicView

public class BasicView extends View { 

    public BasicView(String name) { 
     super(name); 

     Button button = new Button("Show Progress"); 
     button.setOnAction(e -> { 
      MobileApplication.getInstance().showLayer(TestModal.BASIC_LAYER); 
     }); 

     VBox controls = new VBox(button); 
     controls.setAlignment(Pos.CENTER); 

     setCenter(controls); 
    } 

    @Override 
    protected void updateAppBar(AppBar appBar) { 
     appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> System.out.println("Menu"))); 
     appBar.setTitleText("Basic View"); 
     appBar.getActionItems().add(MaterialDesignIcon.SEARCH.button(e -> System.out.println("Search"))); 
    } 
} 

Quand je le lance, et cliquez sur le bouton, est fixé à 0,5 juste pour voir que toute la scène est couverte du fondu d'arrière-plan par la vitre, et je peux » t cliquez sur l'un des boutons sous-jacents jusqu'à ce que le calque soit masqué via la transition de pause.

Layer

+0

Oui, j'ai déjà essayé.J'ai édité ma réponse avec une version simplifiée de ma couche – jns

+0

Dans la version de charme précédente, j'étais capable d'afficher/cacher une couche avec les fonctions correspondantes. 'layer.show()' fonctionne toujours, tandis que 'layer.hide()' ne fonctionne pas. Donc je devais utiliser 'addLayerFactory()' et 'mobileInstance.hideLayer (" myLayer ")' – jns

+0

Cela fonctionne pour moi (c'est sur le dessus de la vue, et il est modal, en cliquant en dehors de lui ne cache pas la couche). Qu'est-ce qui vous manque? Et oui, vous devez utiliser 'addLayerFactory' et' hideLayer'. –