[英]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()
: 根据JavaDoc的
autoHideProperty()
:
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.