简体   繁体   English

Gluon Charm 4.0.0 GlassPane不再是模态吗?

[英]Gluon Charm 4.0.0 GlassPane not modal anymore?

I used following code to install a Layer in the GlassPane and show it: 我使用以下代码在GlassPane安装一个Layer并显示它:

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

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

While on Charm 3.0.0 the layer was showing modal on top of the current view, on Charm 4.0.0 the layer isn't modal anymore. Charm 3.0.0该层在当前视图的顶部显示模式,而在Charm 4.0.0该层不再是模式。 So is there a build in function to show it modal again, or do we have to use an EventFilter ? 那么,有没有内置函数来再次将其显示为模态,还是我们必须使用EventFilter

EDIT: 编辑:

ProgressLayer complete code (not adapted to Charm 4.0.0) ProgressLayer完整代码 (不适用于Charm 4.0.0)

Simplified code of ProgressLayer: 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);
   }
}

在此处输入图片说明

As long as an operation is running, the progressLayer will be shown, and you are not able to interrupt the operation or hide the layer, unless you press the purple icon in the center: 只要操作正在运行,就会显示progressLayer,并且您不能中断该操作或隐藏该图层,除非您按中间的紫色图标:

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

And here is the problem. 这就是问题所在。 When root doesn't use the whole screensize, UI controls that are not covered by root like buttons eg can be activated. root未使用整个屏幕尺寸时,可以激活root用户未覆盖的UI控件,例如按钮。 This behaviour is in contrast to Gluon Charm 3.0.0 此行为与Gluon Charm 3.0.0相反

Have you tried myLayer.setAutoHide(false) ? 您是否尝试过myLayer.setAutoHide(false)

According to JavaDoc for autoHideProperty() : 根据JavaDocautoHideProperty()

Represents whether this Layer should hide when it is clicked outside its bounds - by default this is true. 表示在单击其边界之外时是否应隐藏该图层-默认情况下为true。

EDIT 编辑

This is a small project that works for me: 这是一个对我有用的小项目:

build.gradle 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")));
    }
}

When I run it, and click on the button, the background fade is set to 0.5 just to see that all the scene is covered by the glass pane, and I can't click on any of the underlying buttons until the layer is hidden via the pause transition. 当我运行它并单击按钮时,背景淡入淡入设置为0.5,只是为了看到所有场景都被玻璃窗格覆盖,并且我无法单击任何基础按钮,直到通过暂停过渡。

层

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM