2013-09-01 3 views
0

저는 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()), 코드베이스 설정 등 다양한 방법으로 이미지를 검색했지만 아무 소용이 없다. 어떤 제안? 나는 그가 시간이 있다면

+0

'loadedImages' HashMap에있는 URL의 예는 무엇입니까? 아마도 그들은 Eclipse에서 작동하지만 애플릿으로는 작동하지 않는 file : // URL입니까? –

+0

그들은 file : // URL이 아니었지만 문제를 찾는데 도움이되었습니다. 테스트 및 브라우저에서 getResource 호출이 다른 경로를 반환했음을 나타냅니다. – user2391580

답변

1
img = ImageIO.read(new URL(instance.getCodeBase(), "../img/" + s + ".png")); 

는 그 설명 구조 작업을해야하는 이유에 대한 사용자의 이유를 듣고 좋은 것입니다. AFAIU :

img = ImageIO.read(this.getClass().getResource("/img/" + s + ".png"));