You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaFX中给VBox添加模糊效果但不模糊其子节点

解决VBox背景模糊但子控件保持清晰的问题

直接给VBox设置setEffect(blur)会让容器及其所有子节点都应用模糊效果,这就是你遇到控件也变模糊的原因。要实现仅背景模糊、子控件清晰的效果,你需要把模糊效果单独应用到背景层,而非整个容器。

修正方案:

我们可以先对背景图片添加模糊效果,再将其作为VBox的背景,同时确保VBox本身不应用任何效果,这样子控件就能保持清晰。

修改后的代码如下:

package UI.Controllers;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.effect.BoxBlur;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;

import java.net.URL;
import java.util.ResourceBundle;

public class LoginTemp implements Initializable {
    @FXML
    private VBox loginBox;

    public void applyBlur(){
        // 加载背景图片(修正原代码拼写错误:jepg -> jpg)
        Image originalImage = new Image("bg2.jpg");
        ImageView blurImageView = new ImageView(originalImage);
        
        // 给ImageView添加模糊效果
        BoxBlur blur = new BoxBlur(3, 3, 3);
        blurImageView.setEffect(blur);
        
        // 将带模糊效果的ImageView转换为可用于背景的静态图片
        Image blurredImage = blurImageView.snapshot(null, null);
        
        // 设置VBox的背景为模糊后的图片,移除VBox全局效果
        BackgroundImage bgImage = new BackgroundImage(
                blurredImage,
                BackgroundRepeat.REPEAT,
                BackgroundRepeat.NO_REPEAT,
                BackgroundPosition.DEFAULT,
                BackgroundSize.DEFAULT
        );
        loginBox.setBackground(new Background(bgImage));
        loginBox.setEffect(null);
    }

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        applyBlur();
    }
}

关键说明:

  • 不再给loginBox设置全局模糊效果,仅针对背景图片单独处理模糊。
  • 使用snapshot()方法将带模糊效果的ImageView转换为静态图片,用于VBox背景。
  • 修正原代码中图片扩展名的拼写错误,避免图片加载失败。

如果需要背景随窗口大小自适应,还可以用StackPane分层布局:

  1. 底层放带模糊效果的ImageView作为背景
  2. 上层放置loginBox并设置其背景为透明,子控件自然会在模糊背景上方保持清晰

内容的提问来源于stack exchange,提问作者qbikle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:35:33