首页 > 解决方案 > JFrame 错误解决方法

问题描述

我在编写应用程序时发现了一些奇怪的东西:我希望将 JFrame 放置在整个屏幕上。它与此代码完美配合:

public class NativeFunctions extends JFrame {

    public NativeFunctions() throws HeadlessException {
        this.setUndecorated(true);
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setBackground(new Color(0, 0, 0));
        this.setVisible(true);
    }

    public static void main(String[] args) {
        NativeFunctions n = new NativeFunctions();
    }
}

当我只是更改代码行,将颜色设置为具有 alpha 值的颜色时,事情开始变得很奇怪:

public class NativeFunctions extends JFrame {

    public NativeFunctions() throws HeadlessException {
        this.setUndecorated(true);
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setBackground(new Color(0, 0, 0, 20));
        this.setVisible(true);
    }

    public static void main(String[] args) {
        NativeFunctions n = new NativeFunctions();
    }
}

启动第一个应用程序,JFrame 打开并覆盖屏幕 - 正如预期的那样。尝试在左上角、右上角、右下角或左下角移动鼠标并按下鼠标键。什么都不会发生。对第二个应用程序(使用 alpha 值)执行相同的操作,然后单击将被注册。但这仅发生在最外角!

你能重现这个,你会说这是一个错误吗?您有解决方法的想法吗?

编辑:也很重要:对于所有透明度值都相同!只在最外角起作用,不在应用中间,所以鼠标点击一般不会经过!

标签: javaswingnetbeansjframe

解决方案


(带有 alpha 值)并且点击将被注册。但这仅发生在最外角!

您需要定义“已注册”。

就我而言,无论我在哪里单击,都不会发生任何事情,因为所有鼠标事件都只是传递给框架,但是框架中没有添加任何侦听器,所以我不知道刚刚发生了什么。

这就是我期望部分透明(alpha 值在 1 - 255 之间)时会发生的情况。

但是,如果 alpha 值为 0,则鼠标事件将被 Swing 应用程序忽略并传递到桌面。

因此,例如,如果我单击 Windows“开始”按钮所在的底部/左侧,我会看到“开始”菜单弹出窗口。

如果我点击其他任何地方,那么我点击的应用程序现在被激活并成为活动窗口。

“最外角”(但是您如何定义?)和单击屏幕中央没有区别。

您有解决方法的想法吗?

我猜你想防止当你的 alpha 值在 1 - 255 之间时,鼠标事件被传递给 destop。

您是否尝试将 MouseListener 添加到框架中?

也许您可以尝试将 a 添加GlassPane到框架并将 MouseListener 添加到 GlassPane?


推荐阅读