Java Can';无法为图标加载资源
我正在设置一个简单的GUI,但我一直在尝试为按钮加载图像Java Can';无法为图标加载资源,java,image,icons,jbutton,getresource,Java,Image,Icons,Jbutton,Getresource,我正在设置一个简单的GUI,但我一直在尝试为按钮加载图像 public class Client extends JFrame{ private JTextField field; private JLabel label; private JButton send; private Socket socket; Client(){ super("Messenger"); try { socket
public class Client extends JFrame{
private JTextField field;
private JLabel label;
private JButton send;
private Socket socket;
Client(){
super("Messenger");
try {
socket=new Socket("localhost",65535);
} catch (IOException e1) {
System.out.println("can't estabilish connection");
return;
}
setLayout(new FlowLayout());
label=new JLabel("insert text here");
add(label);
field=new JTextField(20);
add(field);
ImageIcon ico=new ImageIcon(getClass().getResource("res/richard.png"));
send=new JButton("send",ico);
send.setFocusPainted(false);
add(send);
send.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() {
public void run() {
try {
OutputStream out=socket.getOutputStream();
String s=field.getText();
if (s.equals(".")) {
out.write(s.getBytes());
socket.close();
System.exit(0);
}
out.write((s+"\n").getBytes());
field.setText("");
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
pack();
setLocation(500, 400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Client();
}
}
这是一个简单的Messaging应用程序客户端,但我无法在按钮上显示图像。我使用的是getResource()
而不是ImageIcon构造函数,因为如果我使用它,它不会显示在Jar中。
那么我做错了什么??无论我如何编写URL,它都会给我一个NullPointerException。该图像位于我的项目中的“res”文件夹下
这是堆栈跟踪:
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(Unknown Source)
at Client.<init>(Client.java:27)
at Client.main(Client.java:58)
线程“main”java.lang.NullPointerException中的异常
位于javax.swing.ImageIcon。(未知源)
在客户端。(Client.java:27)
位于Client.main(Client.java:58)
它在ImageIcon构造函数中启动(如预期) 来自API文档:
绝对资源名称是根据给定的资源名称构造的
使用此算法:
如果名称以“/”(“\u002f”)开头,则的绝对名称
资源是名称中“/”后面的部分否则,
绝对名称的形式如下:modified\u package\u name/name
其中,修改的包名称是此对象的包名称
用“/”代替“.”(“\u002e”)
如果图像位于“res”文件夹下(项目根目录下),则需要斜杠,路径应如下所示:
new ImageIcon(getClass().getResource("/res/richard.png"));
尝试删除
res/
。为了确定映像的位置,可以使用7Zip打开.jar文件。要使用资源,必须使用资源相对于类文件的路径。请告诉我们这件事。我什么都试过了,/res/richard.png,res/richard.png,richard.png。。。该图像位于项目根文件夹的res文件夹中。不知道该做什么,或者我做错了什么根文件夹在这里可能不起作用。移动该文件夹,使其成为类目录的子目录。如果您使用的是Eclipse,请拖放res文件夹,使其成为类路径的分支。@HovercraftFullOfEels耶!太棒了!!但为什么会这样呢?我在错综复杂的文件路径中找不到路。。。