Java 图像赢得';JLabel中的t显示
我已经浏览了这个网站上的每一篇文章和Java教程,我仍然不明白为什么我的代码不起作用。即使我复制/粘贴其他人的代码,它仍然不起作用 我制作了一个虚拟程序,只是为了测试这一点,代码如下所示: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
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的边界。当做