Java 图像赢得';JLabel中的t显示

Java 图像赢得';JLabel中的t显示,java,image,swing,jlabel,Java,Image,Swing,Jlabel,我已经浏览了这个网站上的每一篇文章和Java教程,我仍然不明白为什么我的代码不起作用。即使我复制/粘贴其他人的代码,它仍然不起作用 我制作了一个虚拟程序,只是为了测试这一点,代码如下所示: import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JLabel; import

我已经浏览了这个网站上的每一篇文章和Java教程,我仍然不明白为什么我的代码不起作用。即使我复制/粘贴其他人的代码,它仍然不起作用

我制作了一个虚拟程序,只是为了测试这一点,代码如下所示:

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.ImageIcon;

public class gui extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    gui frame = new gui();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public gui() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 900, 700);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lblNewLabel = new JLabel(new ImageIcon("bg.png"));
        contentPane.add(lblNewLabel);
    }
}
我试图显示的背景图像bg.png位于项目的根文件夹中。我尝试了路径字符串的多种格式,但没有成功。我做错了什么?

试着这样做:-

ImageIcon icon = createImageIcon("bg.png", "image description");

protected ImageIcon createImageIcon(String path, String description) {
    java.net.URL imgURL = getClass().getResource(path);

    if (imgURL != null) {
        return new ImageIcon(imgURL, description);
    } else {
        System.err.println("Couldn't find file:" +path);
        return null;
    }
}

错误之处在于,当您调用
newimageicon(“bg.png”)
时,您尝试从当前目录加载
bg.png
文件。当前目录是执行
java
的目录。当您从IDE执行
java
时,当前目录可能不是您相信的目录

使用以下代码显示当前目录:

File dir1 = new File (".");
System.out.println("current directory: " + dir1.getAbsolutePath());
您可能应该使用
Class.getResource(“/images/bg.png”)
从类路径加载png文件。在源目录中创建一个
images
文件夹,并将文件放在此目录中。您的IDE将它与
.class
文件一起复制到目标文件夹。如果您没有使用IDE,那么您必须自己复制它

编辑:


经过进一步调查,问题的根本原因似乎是使用了空布局。不过,上面的内容仍然有效,因为从当前目录加载文件不是一个好主意

您正在查找作为文件的图像。当您这样做时,所有搜索都是在一个相对于用户目录的路径中完成的,您可以通过

// code not tested
System.out.println(System.getProperty("user.dir"));
因此,您可能必须调整图像的路径才能将其作为文件。另一个选项是将其作为一个资源,如Siva Charan所述,在这种情况下,路径是相对于类文件的位置的


哦,一旦您学习和使用布局管理器,它们就会变得直观,创建和维护GUI变得更加容易。

只需将bg.png与GUI.class文件放在一起即可。如果你写这段代码,就可以了

private ImageIcon getImage(String path)
{
    URL url = getClass().getResource(path);
    System.out.println(url);
    if (url != null)
        return (new ImageIcon(url));
    return null;
}
有关更多信息,请访问

此处path=“bg.png”;或者如果它在某个文件夹中,而不是path=“someFolder/bg.png”; 所以你要写这样的东西:

JLabel lblNewLabel = new JLabel(getImage("bg.png"));
lblNewLabel.setBounds(30, 30, 100, 100);
希望这能有所帮助


关于

您可能需要对其进行调试,并检查图像文件是否正确加载。然后,您需要检查JLabel组件是否获得其大小,因为将映像添加到JLabel不会扩展JLabel


首先,您应该尝试查看图像处理程序的宽度和高度。

不要使用空布局管理器。@mre这是唯一的原因吗?所有其他的布局看起来都很不直观。绝对布局更容易在gui中进行布局。没有办法用绝对布局来完成这项工作?@MattL922:这不是原因。使用空布局管理器是一种非常糟糕的做法。您的GUI在另一台具有不同设置的机器上看起来像垃圾。学习使用布局管理器。这是设计美观GUI的唯一方法。所有这些答案可能都是正确的,但问题在于我使用了空布局。这实际上最终打印出了图像文件所在的同一目录,但如果目录正确,并且文件名为bg.png,我仍将尝试使用Class.getResource,这可能是由于您使用了空布局,或者是因为图像太小或太透明以至于您看不到它。从代码中删除
setLayout(null)
,并在构造函数末尾调用
pack()
。好吧,我想这实际上不是我的代码的问题,只是我使用的是绝对布局。有人能给我指出一些学习其他布局的好资源吗?为什么绝对不是一个好选择?这是您的代码的一个问题,因为从当前目录加载图像很少是一个好主意,而且因为使用空布局几乎从来都不是一个好主意。swing教程提供了所需的一切:+1,用于指定问题是由于setLayout(null)引起的,然后必须手动设置JLabel的边界。当做