我的需求趋同于我的数据文件。当前应用程序在JAR(使用Eclipse IDE构建)中包含所有类和数据文件。
我注意到人们可以通过多种方式获取这些信息。我需要我的图像文件所在的路径(图形)。我还需要它作为URL使用工具包调用。
Toolkit tk = frame.getToolkit();
image = tk.getImage(url.toFile());
但是我在创建URL或其他方面遇到了麻烦。我尝试了几种不同的方法。此时,我将数据文件保存在文件系统中的类文件旁边。我正在添加另一个函数 - 在调试中运行时删除/ bin目录。
// in class BwServices at init:
try {
rootDataPath = BwServices.class.getProtectionDomain()
.getCodeSource().getLocation().getPath();
rootDataPath = URLDecoder.decode(rootDataPath, "UTF-8");
fileSystemAccess = true;
}
if(rootDataPath.endsWith("/bin/"))
rootDataPath = rootDataPath.substring(0, rootDataPath.length() - 4);
后来......我去拿图像,有些电话不起作用,我不知道为什么
我尝试了两件事......
// 1
String s = "file://" + rootDataPath + d.toString() + fileName;
url = frame.getClass().getResource(s);
// 2
try {
url = new URL(s);
} catch (MalformedURLException e) {
trace("getImage - can't get url: " + s);
e.printStackTrace();
}
其中任何一个都有问题 我要求从不同的地方获取图像。 'frame'是整个执行过程中的父帧,在BwFrame类中。
我的道路在任何尝试中都是这样出来的......
rootDataPath:/ C:/ Users / Markgm / Documents / DEV / workspace / bwp /
所以,我正在寻找方法来打开工具箱的FileInputStream或URL,以及相对于类文件所在的文件(以及调试时的一些技巧)。对于客户端应用程序,这就是这个。总有一天,我可能希望将它作为Applet运行,但我不知道图像文件必须在哪里。 (50x75扑克牌和几个按钮图像)任何帮助或建议表示赞赏!
TIA, 标记
答案 0 :(得分:1)
Toolkit tk = frame.getToolkit();
自Java 1.4以来,不要使用Toolkit
来加载图像。请改用ImageIO.read(String/File/URL)
,这是一种阻止方法,可确保在返回之前加载整个图像。
image = tk.getImage(url.toString());
并且存在实际问题。获得URL
(或File
)对象后,请勿将其丢弃并使用String
表示。更重要的是,请勿提供应该代表String
的{{1}},但实际上代表File
!
我没有阅读其余的一堆代码片段(在问题或后续“回答”中),您可能希望将来发布SSCCE。
答案 1 :(得分:0)
我完全没有使用URL,这是从使用粘贴代码开始的。从类文件运行到从JAR文件运行时,URL的行为和所有内容都发生了变化。所以我在这里有代码,显示了我最终做的一些事情,并对发生的事情(类文件或jar文件)进行了评论,并且我还调整了调试时间(从最后剪掉bin /)。
// root path - starts with jar file or pathspec
try {
rootDataPath = BwServices.class.getProtectionDomain()
.getCodeSource().getLocation().getPath();
rootDataPath = URLDecoder.decode(rootDataPath, "UTF-8");
if(rootDataPath.endsWith("BwPlayer.jar"))
rootDataPath = rootDataPath.substring(0, rootDataPath.length() - 12);
fileSystemAccess = true;
} catch(SecurityException e) {
trace("No file system access: " + e.getMessage());
messageBox(frame, "BwServices", "Cannot access file system");
rootDataPath = "";
} catch (UnsupportedEncodingException e) {
trace("Jar URL decode exception: "+ e.getMessage());
}
if(rootDataPath.endsWith("/bin/")) // remove bin/ portion if in debug
rootDataPath = rootDataPath.substring(0, rootDataPath.length() - 4);
trace("rootDataPath: "+rootDataPath);
上图:来自init()时间。下面是一个getImage()函数,包括额外的调试相关行。注意:url.getFile()没有直接工作有两个原因 - 一个是它有文件:/什么时候出一个jar,另一个因为它不会在预先设定的root /下面取一个完整的pathspec。
static public Image getImage(Directory d, String fileName) {
Image image = null;
String s = d.toString() + fileName;
/*
// Note: Start with / required for this url call (w/o full pathsepc)
URL url = parentFrame.getClass().getResource("/" + s);
if(url == null) {
trace(s + " - null url ");
return null;
}
*/
String file = rootDataPath + s; // url.getFile();
// end note
String t = s = "getImage(" + file + ") ";
Toolkit tk = parentFrame.getToolkit();
if(tk == null)
s = s + "NULL tk ";
else {
try {
// full pathspec needed here
// url.getFile() returns with file:/ when running from the .jar file
// but not when running from .class file (so don't use it)
s = t = "getImage(" + file + ") ";
image = tk.getImage(file); //url.getFile());
MediaTracker media = new MediaTracker(parentFrame);
media.addImage(image, 0);
try {
media.waitForID(0);
} catch(InterruptedException e) {
s = s + e.getMessage();
}
if(image == null) {
// image = null;
s = s + "NULL image ";
} else if(image.getHeight(parentFrame) < 1) {
s = s + "invalid height";
}
} catch (SecurityException e) {
s = s + e.getMessage();
}
}
if(! s.equals(t)) {
s = "file=" + file + "\n" + s;
s = "rootDataPath=" + rootDataPath + "\n" + s;
messageBox(parentFrame, "getImage()", s);
}
return image;
}