2015-03-19 4 views
0

Я делаю java-игру, используя Eclipse. Когда я экспортирую в исполняемую банку и пытаюсь запустить игру на другом компьютере, изображения не видны. После проверки переполнения веб-страниц и стека для подобных проблем, я думаю, что это имеет какое-то отношение к моему использованию ImageIcon вместо ImageIO. Однако я не уверен, как изменить свой код, чтобы загружать изображения с ImageIO вместо ImageIcon.Замена ImageIcon с ImageIO для загрузки изображений

Вот метод, который использует ImageIcon для загрузки изображений

void loadImage() { 

    ImageIcon earth_image_icon = new ImageIcon("earth2.png"); 
    earth = earth_image_icon.getImage(); 

    ImageIcon sun_image_icon = new ImageIcon("sun2.png"); 
    sun = sun_image_icon.getImage(); 

    ImageIcon asteroid_image_icon = new ImageIcon("asteroid.png"); 
    asteroid = asteroid_image_icon.getImage(); 

    ImageIcon bg_image_icon = new ImageIcon("bg_pr.png"); 
    background = bg_image_icon.getImage(); 

    ImageIcon shipA_image_icon = new ImageIcon("ship_alpha.png"); 
    ship_on_asteroid = shipA_image_icon.getImage(); 

    ImageIcon ship_image_icon = new ImageIcon("ship_beta.png"); 
    ship_no_thrust = ship_image_icon.getImage(); 

    ImageIcon shipL_image_icon = new ImageIcon("ship_betaL.png"); 
    ship_left_thrust = shipL_image_icon.getImage(); 

    ImageIcon shipR_image_icon = new ImageIcon("ship_betaR.png"); 
    ship_right_thrust = shipR_image_icon.getImage(); 

    ImageIcon shipU_image_icon = new ImageIcon("ship_betaU.png"); 
    ship_up_thrust = shipU_image_icon.getImage(); 

    ImageIcon shipD_image_icon = new ImageIcon("ship_betaD.png"); 
    ship_down_thrust = shipD_image_icon.getImage(); 

    ImageIcon leftarrow_image_icon = new ImageIcon("leftarrow.png"); 
    leftarrow = leftarrow_image_icon.getImage(); 

    ImageIcon rightarrow_image_icon = new ImageIcon("rightarrow.png"); 
    rightarrow = rightarrow_image_icon.getImage(); 

    ImageIcon downarrow_image_icon = new ImageIcon("downarrow.png"); 
    downarrow = downarrow_image_icon.getImage(); 

    ImageIcon uparrow_image_icon = new ImageIcon("uparrow.png"); 
    uparrow = uparrow_image_icon.getImage(); 

} 

А вот один из методов, которые рисует изображение на JPanel в качестве примера

void drawEarth(Graphics g) { 

    g.drawImage(earth, earth_x_coordinate, earth_y_coordinate, this); 
    Toolkit.getDefaultToolkit().sync(); 
} 

Как конвертировать к использованию ImageIO? Я проверил документацию Oracle, но я теряюсь, пытаясь разобраться в этом, и я очень новичок в программировании и Java.

Update Было предложено, чтобы this может быть решение моей особой проблемой, но я попытался ответы, приведенные на этом посту, и они не работали для моего случая.

+0

Где хранятся изображения, связанные с источником? – MadProgrammer

+0

Изображения сохраняются в папке проекта, а не в исходной папке. Однако я попытался сохранить изображения в исходной папке, а также поместить изображения в папку ресурса и добавить эту папку в путь сборки. – abaxtastic

+0

Если изображения хранятся в папке проекта, вам необходимо убедиться, что они включены вместе с банками и находятся в контексте контекста выполнения (поскольку путь поиска будет относительным с этой точки). Если они включены в «jar» (в комплекте/вложенные), вам нужно будет использовать что-то вроде 'getClass(). GetResource (" ... ")' для их загрузки. В этом случае путь должен быть абсолютным путем к изображениям из корня исходного каталога (исключая папку 'src'). – MadProgrammer

ответ

0

Я создал новый проект в eclipse и скопировал файлы классов в новую папку src проектов. Затем я создал папку ресурсов, добавил ее в путь сборки, создал пакет изображений в этой папке ресурсов и скопировал изображения в этот пакет изображений. По какой-то причине все это сработало. Спасибо всем за вашу помощь

1

Вам нужно будет включить ресурсы изображения в собранную банку. Легкий способ сделать это, если вы используете IDE, например eclipse, - создать папку res или img и поместить туда свои файлы. (Используйте приведенные методы here.)

В этом случае вам, вероятно, не понадобится использовать ImageIO. Однако, если вы все еще хотите использовать ImageIO (который рекомендуется из-за его широкой поддержкой форматов и лучшей обработки исключений, как было упомянуто в комментариях), вы можете сделать следующее:

Icon foo = new ImageIcon(ImageIO.read(getClass().getResource("foo.png")))

+0

'ImageIO' читает больше типов изображений (из коробки) и бросает приятное' IOException', когда все идет не так, что является хорошим способом отслеживания проблем;) – MadProgrammer