当前位置: 首页 > 知识库问答 >
问题:

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

潘智刚
2023-03-14

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

在 JPanel 上添加时的结果:

当我使用这一行时就会发生:

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

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

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

在JFrame上添加时的结果:

部分类代码:

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);

有人能解释一下为什么会发生这样的事情吗?谢谢你的时间和阅读。

编辑:

// 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);

这就是第一个图像中显示的JPanel,没有JLabel。我不能在代码中展示JFrame部分,因为它遍布于整个类中。但是我不认为问题出在JFrame上,所以可能是这个JPanel :/

共有2个答案

张鹏云
2023-03-14

根据您的第一个快照加载图像需要时间。

请使用ImageObserver查看监控以检查图像的状态。

完全加载后,将图像添加到< code>JPanel中。

示例代码:

    new Thread(new Runnable() {

        @Override
        public void run() {
            int width = loading.getIconWidth();

            if (width >= 0) {
                isImageLoaded = true;
                p2.add(loadBar);
                return;
            }

            // Wait if the image is not loaded yet
            while (!isImageLoaded) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException ie) {
                }
            }
        }
    }).start();
宿淳
2023-03-14

你的问题就在这里。。。

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

Swing 不支持基于 alpha 的后台,您的组件是透明的还是不是透明的。

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

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

您需要做的是创建一个自定义组件,将其不透明属性设置为 false 并覆盖它的 paintComponent 方法,并用基于 alpha 的颜色填充背景。我通常喜欢使用AlphaComposite,但这就像...

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());
        }

    }

}

布局管理器,布局管理器,布局管理器…

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

 类似资料:
  • 问题内容: 我有一个JFrame根据您单击的MenuItem显示JPanels。它可以工作,但是现在我需要在将JPanel添加到框架中并显示 它之后调用一个方法(因为我在该面板内使用JFreeChart,并且必须在可见JPanel时调用): 看起来还好吗?是被真出?似乎不是: 这是不工作(被 抛出异常)。这意味着 在调用repaint时,JPanel不可见,我已经测试了以下内容: 现在它可以正常工

  • [编辑:已修复!问题似乎是布局xml中有一个不可见的视频视图覆盖了我的GLSURFACHEVIEW。从布局中删除视频视图将恢复预期的行为。] [编辑#2:使GLSurfaceView使用ARGB888也应该解决这一问题(我认为不能混合具有不同颜色格式的曲面),因为这样做是为了在视频上显示GL。] 我成功地使用了GLSurfaceView,但在Android 3.2平板电脑上发现了一个奇怪的问题。G

  • 问题内容: 将包含图形的添加到时,效果很好。但是,当我尝试添加 其中添加了其他图形的时,它不会显示在中。请参见下面的代码 问题答案: 请注意类的构造函数,使其成为您的习惯,以遵循本示例中所示的顺序。首先向中添加组件,然后再进行调用,例如 ,而不是在此之前。 始终把它当作习惯,每当您覆盖方法时,也要覆盖方法。 并始终像在EDT- 事件调度线程中那样发出呼叫。请阅读Swing中的Concurrency

  • 我正在为平台游戏做教程,但我的Pygame窗口显示一个黑屏。 我不知道怎么解决这个问题。 我尝试再次关闭和打开Visual Studio Code,但没有任何结果。

  • 我在试着编一个纸牌游戏。我有一个像雪碧片一样的系统来获得个人卡。这是我的Deck类的代码(没有一些函数): 当我在自己的JPanel类上绘制单个ImageIcons或大BuffereImage时,所有内容都是黑色的。当我尝试将TYPE\u INT\u RGB更改为ARGB时,图像会变得完全透明且没有大小。jpg版本的图像也会出现这种情况。我尝试了g.drawImage(…,frame);g、 dr

  • 我有一个扩展JFrame的类。它使用以下代码将180个图像加载到数组中 更新:我尝试使用一个JLabel而不是我的ImagePanel类。JLabel似乎也有同样的问题。当我使用JPEG时,它会显示,但当我使用PNG时,它什么也不显示。