После программного удаления файла изображения в Java ImageIcon показывает удаленный файл по пути - PullRequest
0 голосов
/ 03 апреля 2019

Мой проект загружает ImageIcon, который удаляет изображение из пути.

Сначала я загрузил изображение из пути к файлу в ImageIcon, после чего я удалил файл изображения из пути. снова я попытался загрузить изображение из удаленного пути к объекту Same ImageIcon, оно показывает удаленное изображение.

    File file = new File(Utility.generate_file_path("Ec_resized_image\\ansi.png"));
    System.out.println(Utility.generate_file_path("Ec_resized_image\\ansi.png")
        + " : " + file.exists());

    ImageIcon icon = new ImageIcon(Utility.generate_file_path("Ec_resized_image\\ansi.png"));           
    System.out.println("Width: " + icon.getIconWidth());//Here it the image width is showing 1920 
    file.delete();       //here I am deleting the file 

    System.out.println(Utility.generate_file_path("Ec_resized_image\\ansi.png") + " : " + file.exists()); // here file.exists() says false. 

    icon = new ImageIcon(Utility.generate_file_path("Ec_resized_image\\ansi.png")); // Again loading the deleted path
    System.out.println("Width: " + icon.getIconWidth());////Here it the image width is showing again 1920

1 Ответ

2 голосов
/ 03 апреля 2019

ImageIcon(filename) делегирует фактическую загрузку изображения в Toolkit.getDefaultToolkit().getImage(filename) (возможно, не определено как таковое API, но я вижу это в источнике.)

Из Javadoc Toolkit.getImage():

Базовый инструментарий пытается разрешить несколько запросов с одним и тем же именем файла к одному и тому же возвращаемому изображению.
...
Если данные изображения, содержащиеся в указанном файле, изменяются, Image объект, возвращаемый этим методом, может все еще содержать устаревшую информацию , которая была загружена из файла после предыдущего вызова .

Затем этот javadoc продолжается:

Ранее загруженные данные изображения можно вручную отбросить, вызвав метод flush() для возвращенного Image.

Так что, как предложила Мена, icon.getImage().flush() должен выполнитьобмануть.

...