Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX对背景的影响_Java_User Interface_Javafx_Blur_Dropshadow - Fatal编程技术网

JavaFX对背景的影响

JavaFX对背景的影响,java,user-interface,javafx,blur,dropshadow,Java,User Interface,Javafx,Blur,Dropshadow,我正在使用它制作一个带有磨砂玻璃效果的iOS主题JavaFX2(Java7)应用程序。问题是此代码在ImageView上使用其效果。我希望它能对窗户后面的任何东西产生效果,比如: 有什么办法吗?我也喜欢你在上图中看到的小阴影效果 说得清楚一点,我不想要那个滑动条或任何东西,只想要透过窗户看东西的效果,边缘有轻微的阴影。不过,我想用它来代替aero 这可能很重要:我使用的是的修改版本。不透明度是Node的一个属性,Node是JavaFX中显示在屏幕上的内容的父类 因此,您可以在想要淡入的对象上设

我正在使用它制作一个带有磨砂玻璃效果的iOS主题JavaFX2(Java7)应用程序。问题是此代码在ImageView上使用其效果。我希望它能对窗户后面的任何东西产生效果,比如:

有什么办法吗?我也喜欢你在上图中看到的小阴影效果

说得清楚一点,我不想要那个滑动条或任何东西,只想要透过窗户看东西的效果,边缘有轻微的阴影。不过,我想用它来代替aero


这可能很重要:我使用的是的修改版本。

不透明度是Node的一个属性,Node是JavaFX中显示在屏幕上的内容的父类

因此,您可以在想要淡入的对象上设置不透明度。然后必须添加某种方式来更改所需对象的不透明度。使用图像中的滑块是一种方法,但还有其他方法


可以使用DropShadow效果来完成放置阴影。我从来没用过。这有点高,但如果评论中有后续问题,我可以帮助回答。

依赖操作系统的窗口装饰所需的视觉效果只能通过操作系统提供的API实现。因此被下面的
StageStyle.TRANSPARENT
排除

对于JavaFX内容本身,您可以控制
stage>scene>根窗格
层次结构的视觉效果。舞台和场景不支持(也不旨在)高级样式,因此通过将下面的设置设置为“透明”来消除

@Override
public void start(Stage primaryStage) {
    StackPane root = new StackPane();
    root.setStyle("-fx-background-color: null;");
    root.setPadding(new Insets(10));

    DoubleProperty doubleProperty = new SimpleDoubleProperty(0);

    Region region = new Region();
    region.styleProperty().bind(Bindings
            .concat("-fx-background-radius:20; -fx-background-color: rgba(56, 176, 209, ")
            .concat(doubleProperty)
            .concat(");"));
    region.setEffect(new DropShadow(10, Color.GREY));

    Slider slider = new Slider(0, 1, .3);
    doubleProperty.bind(slider.valueProperty());

    root.getChildren().addAll(region, slider);

    primaryStage.initStyle(StageStyle.TRANSPARENT);
    Scene scene = new Scene(root, 300, 250);
    scene.setFill(Color.TRANSPARENT);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}
但是,阴影效果与背景色的alpha值不匹配。您可以通过将阴影的颜色更改为另一种对比度颜色来观察它

输出:

相关问题


以扩展Jewlsea的答案。。并且仅在JavaFX中使用上述示例

虽然这些类不是公共API,但它确实完全避免了AWT堆栈。 以下是一个非公开的例子:

// copy a background node to be frozen over.
    private Image copyBackground(Stage stage) {
        final int X = (int) stage.getX();
        final int Y = (int) stage.getY();
        final int W = (int) stage.getWidth();
        final int H = (int) stage.getHeight();
        final Screen screen = Screen.getPrimary();
        try {

            Robot rbt = com.sun.glass.ui.Application.GetApplication().createRobot();
            Pixels p = rbt.getScreenCapture(
                (int)screen.getBounds().getMinX(),
                (int)screen.getBounds().getMinY(), 
                (int)screen.getBounds().getWidth(), 
                (int)screen.getBounds().getHeight(), 
                true
            );

            WritableImage dskTop = new WritableImage((int)screen.getBounds().getWidth(), (int)screen.getBounds().getHeight());
            dskTop.getPixelWriter().setPixels(
                (int)screen.getBounds().getMinX(),
                (int)screen.getBounds().getMinY(),
                (int)screen.getBounds().getWidth(),
                (int)screen.getBounds().getHeight(),
                PixelFormat.getByteBgraPreInstance(),
                p.asByteBuffer(), 
                (int)(screen.getBounds().getWidth() * 4)
            );

            WritableImage image = new WritableImage(W,H);
            image.getPixelWriter().setPixels(0, 0, W, H, dskTop.getPixelReader(), X, Y);

            return image;
        } catch (Exception e) {
            System.out.println("The robot of doom strikes!");
            e.printStackTrace();

            return null;
        }
    }
添加了小阴影的结果:

    DropShadow shdw = new DropShadow();
    shdw.setBlurType(BlurType.GAUSSIAN);
    shdw.setColor(Color.GAINSBORO);
    shdw.setRadius(10);
    shdw.setSpread(0.12);
    shdw.setHeight(10);
    shdw.setWidth(10);
    layout.setEffect(shdw);

那张图片与我需要的代码无关。它只是显示了我所说的“在窗口后面”的意思。我的意思是,我希望Java窗口后面的任何东西都能使用DropShadow的效果。此外,DropShadow也会应用在窗口后面。如果窗户是不透明的,你可以看到它后面的阴影。啊,我明白了。所以Java窗口后面的对象不在JavaFX的控制之下,它实际上只是操作系统桌面的一部分?是的!我不知道该怎么办!可以控制窗口的不透明度。我做到了。只是在边缘周围添加阴影比较棘手。此外,我放置的链接通过对图像应用效果来起作用。我需要知道如何在动态背景下做到这一点。哈哈。你又这么做了:D.幸好在赏金结束前几秒钟我给了你奖品。我在那里吓坏了,嘿!我这样做是为了你可以在FrostyPane上加载任何节点,并在窗口不对焦时关闭模糊(以使其始终保持一致)。我有几个问题:1。我删除了将所有内容暂停50毫秒的代码,它仍然可以正常工作。有什么我遗漏的吗?2.拖动窗口将重新启动我正在执行的所有功能。例如,当我移动窗口时,启动屏幕将重新启动。有办法吗?还有,是否有任何方法可以轻松实现大小调整?我想我能处理它,但我只是想知道你是否知道任何捷径。不幸的是,如果背景改变,玻璃效果将不会重画。否则,看起来很棒。@jewelsea line 69“末日机器人攻击!”这个答案也是正确的。我怎么对他们两个说“是”呢。。。?
    DropShadow shdw = new DropShadow();
    shdw.setBlurType(BlurType.GAUSSIAN);
    shdw.setColor(Color.GAINSBORO);
    shdw.setRadius(10);
    shdw.setSpread(0.12);
    shdw.setHeight(10);
    shdw.setWidth(10);
    layout.setEffect(shdw);