저는 JApplet으로 실행되는 간단한 게임을 가지고 있습니다. 내가 이클립스에서 테스트 할 때 완벽하게 잘 돌아 간다. 그러나 애플릿으로 내보내고 브라우저에서 테스트하려고하면 이미지를 찾을 수 없습니다.jar 파일에서 이미지를로드하려면 어떻게해야합니까?
다음과index.html (page that displays the applet)
shipyard.jar
_shipyard
__Shipyard.class (main applet class)
_img
__All of my images, saved as .png files
애플릿을 표시하는 데 사용되는 HTML 코드가 될 때 :
<object width="1280" height="720" data="shipyard.jar" type="application/x-java-applet">
<param name="archive" value="shipyard.jar">
<param name="code" value="shipyard.Shipyard">
<param name="align" value="middle">
</object>
내 초기화() 및 실행() 메서드를 설정하는 다음과 같이 jar 파일 내부의 폴더 구조는 프리로드 큐는 다음 이미지를 검색하고 준비하는 것이 반복 :
@Override
public void init(){
markImageForPreload("background");
markImageForPreload("shipyard_interior");
markImageForPreload("tooltip");
markImageForPreload("button");
for(String s : ShipyardExterior.tilePages) markImageForPreload("tiles/" + s);
for(ShipSystem sys : ShipSystem.allSystems){
markImageForPreload("system/interior/" + sys.imgName);
if(sys.getForceExterior()) markImageForPreload("system/exterior/" + sys.imgName);
}
for(ShipWeapon wep : ShipWeapon.allWeapons){
markImageForPreload("weapon/" + wep.imgname);
}
currentScreen = new LoadingScreen();
addMouseListener(this);
addKeyListener(this);
}
@Override
public void run() {
preloadCount = 0;
preloadTotal = preloadQueue.size();
for(String s : preloadQueue){
this.prepareImage(getOrLoadImage(s), this);
preloadCount++;
repaint();
}
currentScreen = new ShipyardInterior();
while(true){
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
try {
if(this.getMousePosition() != null){
mouseX = this.getMousePosition().x/2;
mouseY = this.getMousePosition().y/2;
}
} catch (NullPointerException e){}
currentScreen.onUpdate();
repaint();
try {
Thread.sleep(1000/60);
} catch(InterruptedException e) {}
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
부하와 이미지를 검색하는 JApplet에 클래스에있어서
,public static Image getOrLoadImage(String s){
Image img = instance.loadedImages.get(s);
if(img == null){
System.out.println("Loading " + s + ".png.");
try {
img = ImageIO.read(new URL(instance.getCodeBase(), "../img/" + s + ".png"));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(img == null) System.out.println("Image does not exist.");
else instance.loadedImages.put(s, img);
}
return img;
}
"loadedImages"는 이미지를 URL로 저장하는 정적 HashMap입니다. 메서드가 호출되면 먼저 이미지가로드되는지 확인합니다. 그렇다면 이미지를 반환합니다. 로드되어 있지 않은 경우는, 이미지 인스턴스가 loadedImages에 추가됩니다.
페이지를 열면 애플릿이 실행되지만 이미지가 표시되지 않습니다. drawString(), drawRect() 및 기타 기본 렌더링 메서드가 작동하지만 이미지는 작동하지 않습니다.
나는 인터넷을 통해 사냥했으며이 주제에 유용한 것을 찾을 수 없었다. 한 스레드가 애플릿 항아리에 자기 서명을하라고했는데, 그 애플릿 항아리는 작동하지 않는 것 같습니다. getClass(). getClassLoader(). getRescource()), 코드베이스 설정 등 다양한 방법으로 이미지를 검색했지만 아무 소용이 없다. 어떤 제안? 나는 그가 시간이 있다면
'loadedImages' HashMap에있는 URL의 예는 무엇입니까? 아마도 그들은 Eclipse에서 작동하지만 애플릿으로는 작동하지 않는 file : // URL입니까? –
그들은 file : // URL이 아니었지만 문제를 찾는데 도움이되었습니다. 테스트 및 브라우저에서 getResource 호출이 다른 경로를 반환했음을 나타냅니다. – user2391580