在 JPanel 上添加 .GIF 时显示黑色方块

2023-12-10

我的问题是,当将 .GIF 添加到 JPanel 时,它会显示 .GIF 的黑色方形背景。

在JPanel上添加时的结果:

http://i.imgur.com/W1HXgZ1.jpg

当我使用这一行时会发生这种情况:

p2.add(loadBar); // where p2 = new JPanel();

但是,当我在 JFrame 上添加相同的 .GIF 时,黑色方块不再存在。像这样:

jf.add(loadBar); // where jf = new JFrame();

添加到 JFrame 时的结果:

http://i.imgur.com/0pMAS30.jpg

部分类代码:

String loadLink = "http://i.imgur.com/mHm6LYH.gif";
        URL ajaxLoad = null;
        try {
            ajaxLoad = new URL(loadLink);
        } catch (MalformedURLException e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        }
        ImageIcon loading = new ImageIcon(ajaxLoad);
        JLabel loadBar = new JLabel(loading);
        loadBar.setBounds(70, 60, 54, 55);
        loadBar.setOpaque(false);
        //jf.add(loadBar);
        p2.add(loadBar);

有人可以解释一下为什么会这样吗?感谢您的时间和阅读。

EDIT:

// Creates the Initialization Panel
        p2 = new JPanel();
        // Sets the background, black with 125 as alpha value
        // This is less transparent
        p2.setLayout(null);
        p2.setBackground(new Color(0,0,0,150));
        // Sets a border to the JPanel
        p2.setBorder(new LineBorder(Color.WHITE));
        // Sets some size to the panels
        p2.setBounds(20, 20, 200, 150);

        // Adds the loading gif
        String loadLink = "http://i.imgur.com/mHm6LYH.gif";
        URL ajaxLoad = null;
        try {
            ajaxLoad = new URL(loadLink);
        } catch (MalformedURLException e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        }
        ImageIcon loading = new ImageIcon(ajaxLoad);
        JLabel loadBar = new JLabel(loading);
        loadBar.setBounds(70, 60, 54, 55);
        loadBar.setOpaque(false);
        p2.add(loadBar);

这是第一张图片中显示的没有 JLabel 的 JPanel。我无法真正在代码中显示 JFrame 部分,因为它分布在整个类中。但我不认为问题出在 JFrame 上,所以可能是这个 JPanel :/


你的问题就在这里...

p2.setBackground(new Color(0,0,0,150));

Swing 不支持基于 alpha 的背景,无论您的组件是透明的还是不透明的。

这样做意味着组件“尝试”使用 alpha 值作为背景填充颜色,但绘制管理器不知道它应该在组件下方绘制,从而导致各种问题和问题

现在,这有点棘手。您需要使用以下方法使容器透明setOpaque(false),但这现在意味着背景未绘制。

您需要做的是创建一个自定义组件,并将其设置为opaque财产给false并覆盖它paintComponent方法并用基于 alpha 的颜色填充背景。我通常喜欢使用AlphaComposite,但这也有效......

Spinny

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class TranslucentPanelExample {

    public static void main(String[] args) {
        new TranslucentPanelExample();
    }

    public TranslucentPanelExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                try {
                    JLabel background = new JLabel(
                            new ImageIcon(ImageIO.read(
                                            getClass().getResource("/background.jpg"))));
                    background.setLayout(new GridBagLayout());
                    background.add(new WaitPane());

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(background);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException exp) {
                    exp.printStackTrace();
                }
            }
        });
    }

    public class WaitPane extends JPanel {

        public WaitPane() {
            setLayout(new GridBagLayout());
            setBorder(new EmptyBorder(12, 12, 12, 12));
            // This is very important
            setOpaque(false);
            setBackground(new Color(0, 0, 0, 150));

            String loadLink = "http://i.imgur.com/mHm6LYH.gif";
            URL ajaxLoad = null;
            try {
                ajaxLoad = new URL(loadLink);
            } catch (MalformedURLException e3) {
                // TODO Auto-generated catch block
                e3.printStackTrace();
            }

            ImageIcon loading = new ImageIcon(ajaxLoad);
            JLabel loadBar = new JLabel(loading);
            loadBar.setHorizontalAlignment(JLabel.CENTER);
            loadBar.setVerticalAlignment(JLabel.CENTER);
            add(loadBar);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(getBackground());
            g.fillRect(0, 0, getWidth(), getHeight());
        }

    }

}

布局管理器,布局管理器,布局管理器......

我怎么强调布局管理器的重要性都不为过。您所依赖的“神奇”数字可能并不总是符合现实......

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

在 JPanel 上添加 .GIF 时显示黑色方块 的相关文章

随机推荐

  • 具有相同簇大小的 K 均值算法变体

    我正在寻找最快的算法 用于按距离将地图上的点分组为大小相等的组 这k 均值聚类算法看起来简单且有前途 但不能产生同等规模的群体 该算法是否有一种变体 或者是否有一种不同的算法可以允许所有集群的成员数量相等 也可以看看 将 n 个点分组到 k
  • MongoDB 无法确定表达式错误的序列化信息

    我的数据具有以下结构 public enum ParamType Integer 1 String 2 Boolean 3 Double 4 public class Gateway public int id get set public
  • 清除Android的本地通知cordova插件

    I use 适用于 Android 的 Phonegap 本地通知插件显示特定日期的通知 我使用 Cordova 2 2 我使用 cordova 的升级教程修改插件 显示通知 但当我单击它时 应用程序未打开且通知未清除 我怎样才能解决这个问
  • 动态改变自定义seekBar的LinearGradient颜色比率

    我创建了一个带有自定义的搜索栏LinearGradient可绘制的 但是 我希望能够更改每种颜色的渐变比例 这里我使用 3 种颜色 如果满足以下条件 它们会均匀分布positions is null 事实上 我想要的是为每种颜色提供宽度或比
  • 如何从 weblogic 12.2.1 禁用 Jersey

    Weblogic 12 2 1内部有Jersey 2 21 1作为JAX RS 2 0的实现 但我们想使用Jersey 2 5 1或最新版本的Jersey 解决冲突的一般方法是在配置文件中定义类以从应用程序加载类 但是当你升级weblogi
  • 类模板的别名

    考虑一个别名模板 例如A在下面的代码中 现在让B是以下的别名模板A 在下面的代码中 这些类模板用作结构的模板参数C它仅专门用于一种类型名称 A clang std c 11存在于error implicit instantiation of
  • BOM 随机出现在 JSON 回复中

    我正在使用 JSON 和 cURL 实现两个服务器之间的通信 问题是 有时 JSON 回复中的开括号之前会附加 BOM 字节顺序标记 我已经设法修剪它并成功解析 JSON 字符串 但考虑到 JSON 是由我自己的代码生成的 我不知道该 BO
  • 在R中,如何在将对象发送到函数后获取对象的名称?

    我正在寻找相反的get 给定一个对象名称 我希望直接从该对象中提取代表该对象的字符串 简单的例子foo是我正在寻找的函数的占位符 z lt data frame x 1 10 y 1 10 test lt function a mean x
  • 收到 org.postgresql.util.PGobject 类型的对象

    我可以从代码中将几何数据插入数据库 但只能使用 SQL 编辑器 例如 PGAdmin III 查询数据 我无法将几何数据检索回我的代码 每次尝试都会以 已接收类型为 org postgresql util PGobject 的对象 结束 即
  • 如何在 iOS 中以编程方式添加 UITabBarItem 的标识符类型?

    我想在 iOS 中以编程方式添加 UITabBarItem 在界面生成器中 我们可以轻松选择搜索 收藏夹 最近选项卡等标识符 我想知道如何以编程方式添加这些标识符类型 您将其添加为 UIViewController 属性吗 你创建一个UIT
  • 如何捕获 ASP.NET 应用程序中未处理的异常?

    在一次 NET考试中我遇到了这个问题 您可以使用以下哪项来捕获应用程序中未处理的异常 服务器错误 页面错误 应用程序错误 响应错误 错误事件 我知道它的Application Error 但我想知道的是其他的是什么 通过一些谷歌搜索 我发现
  • 无法从我自己的 angularjs api 获取 JSONP 数据

    我正在尝试从我自己的 api 获取数据 但无法成功将数据获取到 vegdata 变量 这是控制器代码 scope filterText null scope vegdata scope init function url http 192
  • WPF TreeView 数据绑定以隐藏/显示展开/折叠图标

    我实现了一个 WPF 按需加载树视图 如中所述this 非常好的 文章 在上述解决方案中 使用虚拟元素来保留展开 图标 树视图项目行为 当用户单击扩展器时 虚拟项目将替换为真实数据 我想通过添加属性来完善模型public bool HasC
  • 哪些 Swing 组件方法是线程安全的?

    根据摇摆教程 一些 Swing 组件方法在 API 规范中被标记为 线程安全 这些可以从任何线程安全地调用 所有其他 Swing 组件方法都必须从事件分派线程调用 忽略此规则的程序可能在大多数情况下都能正常运行 但会出现难以重现的不可预测的
  • 无法创建 /dev/stdout:没有这样的设备或地址

    我想通过节点运行 shell 命令并捕获标准输出的结果 我的脚本在 OSX 上运行良好 但在 Ubuntu 上不行 我已将问题和脚本简化为以下节点脚本 var execSync require child process execSync
  • python中将edgelist导入igraph的格式

    igraph 接受的用于导入 python 的边缘列表格式是什么 包含加权边缘的文本文件应该是什么样子 我以前曾在 R 中使用过 igraph 但在我需要使用的机器上没有安装有效的 R 所以我陷入了 python 困境 我有一个 egeli
  • Python Matplotlib 滑块已绘制但不移动或更新

    我正在尝试绘制一个散点图 其中一个点根据滑块调整的参数移动 我需要参数是坐标列表中的位置 我拥有它 因此可以绘制散点图 并且我可以通过更改位置来手动移动点 但是当我尝试实现滑块时 它会显示 但无法更新绘图 任何帮助都会很棒 到目前为止我所拥
  • Catia VBA 到 .CATScript(针对“集合”类型)

    在我的 VBA 代码中 我使用以下内容 Dim docsToSave As Scripting Dictionary Set docsToSave New Scripting Dictionary Dim toRemove As Colle
  • Matlab 上 Z 归一化 (z-score) 函数的反函数

    在Matlab R2014a中我有信心使用z分数 x 功能 function z mu sigma zscore x flag dim if isequal x z return end if nargin lt 2 flag 0 end
  • 在 JPanel 上添加 .GIF 时显示黑色方块

    我的问题是 当将 GIF 添加到 JPanel 时 它会显示 GIF 的黑色方形背景 在JPanel上添加时的结果 当我使用这一行时会发生这种情况 p2 add loadBar where p2 new JPanel 但是 当我在 JFra