2015-09-10 1 views
0

Все, что я пытаюсь сделать, это создать JLabel, используя изображение, расположенное в том же каталоге, что и .jar, и если он не существует, он будет загружать фотографию по умолчанию, расположенную внутри .jar сам. Картина существует в папке однако она всегда по умолчанию на картинке внутри .jarИспользование образа из той же папки, что и скомпилированный Jar, не работает

String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 

File logo = new File(path + "logo.png"); 

JLabel lblNewLabel_1; 
if (logo.exists()){ 
    lblNewLabel_1 = new JLabel(new ImageIcon(logo.getPath())); 
} else { 
    lblNewLabel_1 = new JLabel(new ImageIcon(Main.class.getResource("/com/daniel/Coffee.png")));  
} 

frame.getContentPane().add(lblNewLabel_1, BorderLayout.WEST); 

final JLabel lblStatus = new JLabel(new ImageIcon(Main.class.getResource("/com/daniel/status1.png"))); 
frame.getContentPane().add(lblStatus, BorderLayout.EAST); 
+1

Проверка на getResource возвращения нуля. –

+0

Вы не должны использовать 'String path = this.getClass(). GetProtectionDomain(). GetCodeSource(). GetLocation(). GetPath();'. Чтобы получить внешний файл, вы должны использовать класс Path: 'Path path = FileSystems.getDefault(). GetPath (" logo.png ");' – sanastasiadis

+0

Если 'getResource' возвращает null, мы получим' NPE' здесь, я думаю, don Не так ли? – Antoniossss

ответ

0

Самый простой способ диагностировать эту проблему заключается в применении простой System.out.println() как здесь

String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(; 
System.our.println("Jar path is "+path); <- you will see the actual path content here 
File logo = new File(path + "logo.png"); 

Проверьте результат и при необходимости отрегулируйте путь конкатенации. Я предполагаю, что этот путь указывает на другую директорию, чем вы думаете, или просто отсутствует File.separator в конце. Попробуйте и поделитесь результатами!

+0

Я сделал это, а также путь «... \ logo.jar». И само фактическое изображение просто является «\ logo.jar \ logo. png 'Как мне перейти в каталог по этому пути? – djohn316

+0

Если 'getLocation()' возвращает 'File', то' getParentFile() '. Вы всегда можете использовать '/../' для перехода на один уровень вверх. – Antoniossss

+0

Вы действительно не должны конкатенировать имя файла самостоятельно, но полагайтесь на методы API. –

0

Похоже, что вам не хватает '/' в конце path. Сделайте это следующим образом:

String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 
File logo = new File(new File(path).getParentFile(), "logo.png"); 
... 

Загвоздка в первый создание файла для содержащего каталог, а затем с помощью конструктора File(File dir, String name) вместо конкатенации.

Кроме того, вы должны заранее проверить права доступа к папке и файлу, обеспечивая надлежащий выход журнала для диагностики ошибок. Для этого используйте canRead() вместо exists() (предполагается, что log доступен как некоторая лесозаготовительная установка - заменить механизм протоколирования по вашему выбору):

String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 
File sourceLocation = new File(path); 

// go up in the hierarchy until there is a directory 
while (sourceLocation != null && !sourceLocation.isDirectory()) { 
    sourceLocation = sourceLocation.getParentFile(); 
    if (sourceLocation == null) { 
     log.warn(path + " is not a directory but has no parent"); 
    } 
} 

if (sourceLocation != null && sourceLocation.canRead()) { 
    File logo = new File(sourceLocation, "logo.png"); 
    if (logo.canRead()) { 
     log.info("Using logo " + logo.getAbsolutePath()); 
     lblNewLabel_1 = new JLabel(new ImageIcon(logo.getPath())); 
    } else { 
     log.warn("can not read " + logo.getAbsolutePath()); 
    } 
} 

if (lblNewLabel_1 == null) { 
    log.warn("logo location not accessible, using default logo: " + sourceLocation); 
    lblNewLabel_1 = new JLabel(new ImageIcon(Main.class.getResource("/com/daniel/Coffee.png"))); 
} 

// ... 
+0

Глядя на то, где находится путь к файлу с логотипом, он делает ... \ logo.jar \ logo.png – djohn316

+0

Хорошо, я добавил вызов 'getParentFile()', чтобы удалить 'logo.jar' из пути. –

Смежные вопросы