[英]Gluon Charm 4.0.0 GlassPane not modal anymore?
我使用以下代码在GlassPane
安装一个Layer
并显示它:
glassPane.getLayers().add(myLayer);
MobileApplication.getInstance().addLayerFactory("myLayer", ()-> myLayer);
MobileApplication.getInstance().showLayer("myLayer");
在Charm 3.0.0
该层在当前视图的顶部显示模式,而在Charm 4.0.0
该层不再是模式。 那么,有没有内置函数来再次将其显示为模态,还是我们必须使用EventFilter
?
编辑:
ProgressLayer完整代码 (不适用于Charm 4.0.0)
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);
}
}
只要操作正在运行,就会显示progressLayer,并且您不能中断该操作或隐藏该图层,除非您按中间的紫色图标:
progressLayer.setOnCancelled(e -> hideLayer(progressLayer.getLayerName()));
这就是问题所在。 当root
未使用整个屏幕尺寸时,可以激活root
用户未覆盖的UI控件,例如按钮。 此行为与Gluon Charm 3.0.0相反
您是否尝试过myLayer.setAutoHide(false)
?
根据JavaDoc的autoHideProperty()
:
表示在单击其边界之外时是否应隐藏该图层-默认情况下为true。
编辑
这是一个对我有用的小项目:
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.**.*'
]
}
}
测试模块
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());
}
}
}
基本视图
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")));
}
}
当我运行它并单击按钮时,背景淡入淡入设置为0.5,只是为了看到所有场景都被玻璃窗格覆盖,并且我无法单击任何基础按钮,直到通过暂停过渡。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.