随便写个Swing小程序,遇到了一个尴尬的问题,如题……这里分享一下解决问题的过程和结论,希望对读者有所帮助。
使用window-builder选择icon,生成这样的路径,运行可显示:
但是这种路径只是普通Java项目的路径,但是当我们遇到这样的Maven项目时: 使用类似于上述的路径会疯狂报错:
信息如下:
java.lang.NullPointerException at javax.swing.ImageIcon.(ImageIcon.java:217) at com.train.view.Table.(Table.java:54) at com.train.view.Table$1.run(Table.java:19) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我查了做了很多尝试,也思考了很久如何处理这个路径的问题。诸如src
这种,都不能读取icon。
我怀疑是Eclipse和IDEA存在差异,决定在Eclipse里模拟这种包结构:
同样把路径配置交给window-builder:
将这种写法沿用到IDEA中,还是报错空指针。
最终,我想到这里使用了Table.class,我决定去Maven工程目录下找到这个文件:
我恍然大悟:问题不在IDE,这种Maven工程结构与传统的JavaSE工程结构不同。这里找路径要基于.class所在的target,我们放置在resources下的images文件都被放到和com“平级”的目录下,所以需要把路径改成这样:
此时直接使用Crtl+左键单击即可访问图片,运行也能看到我们想看到的了:
问题如此解决,再次提醒大家,找ImageIcon的图片路径要看.class!