我正在设置一个简单的GUI,但我试图为按钮加载图像时遇到困难。
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();
}
}
它是一个简单的应用程序的客户端,但我无法在按钮上显示图像。我使用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)
它在ImageIcon构造函数中发起(如预期的那样)。
答案 0 :(得分:0)
来自java.lang.Class#getResource API文档:
从给定的资源名称构造绝对资源名称 使用这个算法:
如果名称以'/'('\ u002f')开头,则的绝对名称为 资源是'/'后面的名称部分。 ,否则下, 绝对名称具有以下形式: modified_package_name / name 其中modified_package_name是此对象的包名称 用'/'代替'。' ( '\ u002e')。
如果您的图像位于“res”文件夹下(在项目根目录下),则需要使用斜杠,路径应如下所示:
new ImageIcon(getClass().getResource("/res/richard.png"));