如何使用 Swing 和 JLayer<> 在 Java 中制作模糊的 JFrame/JDialog?

2023-11-29

我正在尝试模糊我的 JFrame。这个想法是使用 JLayer/LayerUI 模糊 JFrame 中的所有组件/控件。这是我到目前为止所做的:

这是制作模糊效果的 LayerUI 类:

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import javax.swing.JComponent;
import javax.swing.plaf.LayerUI;

public class BlurLayerUI extends LayerUI<Component> {

    private BufferedImage mOffscreenImage;
    private final BufferedImageOp mOperation;

    public BlurLayerUI() {
        int blurValue = 6;
        int blurCount = blurValue*blurValue;
        float ninth = 1.0f / blurCount;
        float[] blurKernel = new float[blurCount];
        for(int i=0; i<blurCount; i++) {
            blurKernel[i] = ninth;
        }
        mOperation = new ConvolveOp(new Kernel(blurValue, blurValue, blurKernel), ConvolveOp.EDGE_NO_OP, null);
    }

    @Override
    public void paint (Graphics g, JComponent c) {
        int w = c.getWidth();
        int h = c.getHeight();
        if(w == 0 || h == 0) {
            return;
        }
        // only create the offscreen image if the one we have is the wrong size.
        if(mOffscreenImage == null ||  mOffscreenImage.getWidth() != w ||  mOffscreenImage.getHeight() != h) {
            mOffscreenImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        }
        Graphics2D ig2 = mOffscreenImage.createGraphics();
        ig2.setClip(g.getClip());
        super.paint(ig2, c);
        ig2.dispose();
        Graphics2D g2 = (Graphics2D)g;
        g2.drawImage(mOffscreenImage, mOperation, 0, 0);
    }

}

...这是一个创建 JFrame 的测试类:

import java.awt.Component;
import javax.swing.JLayer;

public class BlurryTest extends javax.swing.JFrame {

    public BlurryTest() {
        initComponents();
        // what do I have to do here to blurry this JFrame ... ??
        JLayer<Component> blurLayer = new JLayer<>(this.getLayeredPane(), new BlurLayerUI());
        //this.add(blurLayer);
        //this.setGlassPane(blurLayer);
        //this.getGlassPane().setVisible(true);
    }

    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jCheckBox1 = new javax.swing.JCheckBox();
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");

        jButton2.setText("jButton2");

        jCheckBox1.setText("jCheckBox1");

        jTextField1.setText("jTextField1");

        jTextField2.setText("jTextField2");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jButton2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 234, Short.MAX_VALUE)
                        .addComponent(jButton1))
                    .addComponent(jTextField1)
                    .addComponent(jCheckBox1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jTextField2))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jCheckBox1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 69, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addContainerGap())
        );

        pack();
    }                     

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new BlurryTest().setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JCheckBox jCheckBox1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;

}

问题出在类的构造函数中。我如何构建提供 LayerUI 对象的 JLayer 对象来模糊 JFrame 的整个内容?

非常感谢任何帮助 - 谢谢!


组件直接添加到框架中contentPane,尝试使用...

JLayer<Component> blurLayer = new JLayer<>(this.getContentPane(), new BlurLayerUI());
setContentPane(blurLayer);

instead

BluredContentPane

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Swing 和 JLayer<> 在 Java 中制作模糊的 JFrame/JDialog? 的相关文章

  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • Java中Gson、JsonElement、String比较

    好吧 我想知道这可能非常简单和愚蠢 但在与这种情况作斗争一段时间后 我不知道发生了什么 我正在使用 Gson 来处理一些 JSON 元素 在我的代码中的某个位置 我将 JsonObject 的 JsonElements 之一作为字符串获取
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • Mockito 和 Hamcrest:如何验证 Collection 参数的调用?

    我遇到了 Mockito 和 Hamcrest 的泛型问题 请假设以下界面 public interface Service void perform Collection
  • 如何更改 Swagger-ui URL 前缀?

    我正在使用 Springfox Swagger2 和 Spring boot 1 5 9 我可以通过此链接访问 swagger UI http localhost 8090 swagger ui html http localhost 80
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve

随机推荐

  • 如何解决“OSError:告知位置被 next() 调用禁用”

    我正在创建一个文件编辑系统 并希望创建一个基于行的tell 函数 而不是基于字节的函数 该函数将在带有 open file 调用的 with 循环 内部使用 该函数是一个类的一部分 该类具有 self f open self file a
  • 如何在 Mac OS X Lion 上构建哈希(使用最新的 ffmpeg-devel)

    在 OSX 上构建 pHash 0 9 4 可能会很棘手 对于那些遇到问题的人 我下面有点冗长的回答可能会有所帮助 确保您的 macports 已完全更新并正常工作 这意味着最近的 Xcode 并在 Xcode 首选项 gt 下载 gt 组
  • 变量名“@Param”已被声明

    当用户单击搜索按钮两次以上时 我收到给定代码的以下错误消息 有人可以帮助我做错什么吗 变量名 Param 已经 已宣布 变量名必须是 在查询批次中是唯一的或已存储 程序 protected void btnSearch Click obje
  • SQL Server 2008 具有空间索引的可为空地理列的性能

    我在 SQL Server 2008 上发现一些奇怪的性能问题 该问题具有带有空间索引的可为空地理列 每个空值都作为根节点存储在空间索引内 例如 具有 5 000 000 个地址的表 其中存储了 4 000 000 个地址 每次查询索引时
  • 为什么连接表的一对多双向映射使用内连接和左外连接

    我正在关注 Hibernate 文档带有连接表的双向一对多之间Person实体和Address实体和我的映射文件与文档中给出的相同
  • 将变音符号从 Node.js 发送到 iOS

    我不知道这是 Node js 还是 iOS 问题 但是当我尝试发送包含变音符号 和 的 JSON 对象时 设置的内容长度似乎是错误的 这是我的设置 我的 Node js 服务器通过以下方式发送数据 mongodb request toArr
  • 在C++中,是否可以将一个类声明为从另一个类继承?

    我知道我能做到 class Foo 但我可以将一个类声明为从另一个类继承吗 例如 class Bar class Foo public Bar 一个示例用例是协变引用返回类型 somewhere h class RA class RB pu
  • PHP 字符串函数与 mbstring 函数

    我的申请到目前为止只有英文版 整个模板和数据库的内容编码均为 UTF 8 我现在希望将应用程序国际化 翻译成具有绝对需要 UTF 8 的字符集的语言 该应用程序使用各种 PHP 字符串函数 例如strlen strpos substr 等等
  • 对 SQL INSERT 语句使用 Python 字典

    我正在尝试使用dict执行 SQLINSERT 逻辑基本上是 INSERT INTO table dict keys VALUES dict values 但是 我很难弄清楚执行此操作的正确语法 流程 这就是我目前所拥有的 data sor
  • 更新 Azure DevOps 中不同存储库中的 NuGet 参考

    我已经使用 Git 在 Azure DevOps 中设置了一个多存储库 为简单起见 假设我有 2 个存储库 存储库 A 和 B Repo A 的结果是一个公共库 DLL 存储库 B 引用存储库 A 生成的 DLL 通过 NuGet 包 存储
  • 当变量保存值时插入 COUNTIF 公式

    考虑 Cells 2 Q Formula COUNTIF P 1 P1 P2 0 当我有一个保存值的变量时 如何插入这些公式 有时我必须从 3550 行和 4000 行开始公式 这取决于数据 好吧 当我用谷歌搜索时 我什么也没找到 他们都使
  • 无需越狱即可检测传入的短信或 iMessage

    在我的应用程序中 我只是尝试检测传入的 SMS 或 iMessage 我不需要知道它来自哪里或其内容 只要知道它进来即可 我见过很多越狱解决方案 有没有办法在不越狱的情况下在 iOS 6 中做到这一点 看起来如果没有越狱就不可能做到这一点
  • 如何自定义浮动操作按钮形状?

    我正在尝试创建一个具有自定义形状的自定义 FAB 我尝试过设置android background随着shapeAppearanceOverlay and shapeAppearance财产 但仍然没有运气
  • 如何使用 Firefox SDK 插件将 iframe 附加到托管页面?

    Assume frame htmlFirefox SDK 插件中的数据文件夹内 如何附加 iframe 并定义frame html作为它的来源 附加信息 由于CPS 不可能使用内联源 所以我不能使用data load frame html
  • Ubuntu 11.04 上的 wx.TaskBarIcon

    Ubuntu 11 04下Unity没有托盘 如何让图标出现在 Unity 中的某个位置 wx TaskBarIcon 没有出现在任何地方 谢谢 使用 Ubuntu Unity 桌面环境 即 Ubuntu 11 04 或 11 10 您需要
  • Struts 2 中的 等效项

    下面是 html 标签 multibox 我想将其迁移到 struts 2
  • Strapi:是否可以跟踪用户修改内容?

    我目前正在对 Strapi 进行一些研究 以便在其上构建我的 API 我想知道是否可以在 JSON 中公开一个字段 该字段包含有关负责对特定内容进行最后修改的用户的信息 我知道 API 默认在 JSON 对象中公开一个 updatedAt
  • matplotlib 轴刻度标签由散点图覆盖(使用脊柱)

    我想让我的轴穿过散点图中的原点 0 0 这就是我在下面的示例中设置脊柱位置的原因 问题是散点图上的实际数据点覆盖了轴刻度标签 因此无法看到它们 如何让 matplotlib 用我的轴刻度标签 覆盖 数据点以便可以看到它们 import nu
  • 使用 PDFBox ETSI 验证进行 Pades 签名

    我使用 PDFBOX 创建了 PDF PAdES 签名 并且正在使用 ETSI 在线验证器1 它需要注册 现在我在报告中只收到两个错误 但我有点不知道它们是什么或如何修复它们 这是 etsi 在线验证器报告 这是我用来签名的代码 Overr
  • 如何使用 Swing 和 JLayer<> 在 Java 中制作模糊的 JFrame/JDialog?

    我正在尝试模糊我的 JFrame 这个想法是使用 JLayer LayerUI 模糊 JFrame 中的所有组件 控件 这是我到目前为止所做的 这是制作模糊效果的 LayerUI 类 import java awt Component im