我希望您对我在支持插件的应用程序中加载资源的实现有所了解。
在我的主应用程序中,我有一个资源处理程序类,我已经将其暴露给我的插件。当插件试图获取他们的资源时,这个类被创建为一个帮助类。
public class ResourceHelper{
private Class<?> T;
public ResrouceHandler(Class<?> T){
this.T = T;
}
public BufferedImage getImageResource(String path){
T.getClassLoader().getResource()...
}
}
为了使用助手,调用者必须创建一个实例。
ResourceHelper resourceHelper = new ResourceHelper(getClass())
但我不想再使用getClass()方法,而是让ResourceHelper自己获取当前的类加载器。我尝试过使用Thread.currentThread()。getContextClassLoader()但它似乎没有用。
答案 0 :(得分:1)
不确定你做错了什么,但你的助手班对我来说很好。
TestResourceHelper.java
import factory.ResourceHelper;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestResourceHelper {
private static class ImagePanel extends JPanel {
BufferedImage img;
ResourceHelper helper;
public ImagePanel() throws IOException {
helper = new ResourceHelper(TestResourceHelper.class);
img = helper.getImageResource("resources/stackoverflow5.png");
}
protected void paintComponent(Graphics g) {
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
public Dimension getPreferredSize() {
return new Dimension(250, 250);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
try {
JOptionPane.showMessageDialog(null, new ImagePanel(), "Test Image", JOptionPane.PLAIN_MESSAGE);
} catch (IOException ex) {
Logger.getLogger(TestResourceHelper.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
}
ResourceHelper.java
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ResourceHelper{
private Class<?> T;
public ResourceHelper(Class<?> T){
this.T = T;
}
public BufferedImage getImageResource(String path) throws IOException{
BufferedImage image = ImageIO.read(T.getClassLoader().getResource(path));
return image;
}
}
文件结构
结果