Очень странная проблема с чтением ширины и высоты изображения (Java)

#java #image #swing #width #awt

#java #изображение #качать #ширина #awt

Вопрос:

Я создаю метод, который возвращает ширину и высоту изображения. Это обычный значок размером 32×32. Вот что я сделал до сих пор:

     Image icon;
    String filename = "G:\icon.jpg";

    int iconWidth = 0;
    int iconHeight = 0;

    icon = Toolkit.getDefaultToolkit().getImage(filename);
    iconWidth  = icon.getWidth(null);
    iconHeight = icon.getHeight(null);
    System.out.println(iconWidth);

    JFrame window = new JFrame();

    icon = Toolkit.getDefaultToolkit().getImage(filename);
    iconWidth  = icon.getWidth(null);
    iconHeight = icon.getHeight(null);
    System.out.println(iconWidth);
  

Код выводит

   -1
  32
  

32 — это правильная ширина изображения. Но почему сначала возвращается значение -1? Код точно такой же. Удаление строки «JFrame» приводит к возврату двух единиц. Может ли JFrame влиять на набор инструментов по умолчанию?

Я также пробовал этот код:

         JFrame window = new JFrame();
        icon = Toolkit.getDefaultToolkit().getImage(filename);
        iconWidth  = icon.getWidth(null);
        iconHeight = icon.getHeight(null);
        System.out.println(iconWidth);
  

Он также возвращает -1. Я просто не могу понять, почему я должен вызывать это дважды, чтобы получить правильный результат.

Ответ №1:

Из документации для getWidth :

Определяет ширину изображения. Если ширина еще не известна, этот метод возвращает значение -1, а указанный ImageObserver объект уведомляется позже.

Так что, возможно, изображение все еще загружается асинхронно. Попробуйте использовать ImageObserver, чтобы вы могли получать уведомления, когда информация становится доступной.

Комментарии:

1. Можете ли вы привести пример того, как использовать MediaTracker или ImageObserver в этом случае? Я никогда не мог инициализировать MediaTracker, потому что я всегда получаю «Конструктор MediaTracker (MainApp) не определен». С ImageObserver я застреваю в методе imageUpdate ().

2. @David: Что вы имеете в виду, когда «застреваете» в imageUpdate методе? Вам в основном нужно реализовать ImageObserver , чтобы делать все, что вам нужно, когда информация об изображении известна.

3. «застрять» означает после прочтения многочисленных примеров (таких как этот java2s.com/Code/JavaAPI/java.awt.image/ImageObserverALLBITS.htm ), Я все еще не могу понять, как это сделать, главным образом потому, что я не очень знаком с интерфейсами. Я также не совсем понимаю, что происходит. Спасибо за вашу помощь.

4. @David: Хорошо, в таком случае я предлагаю вам пересмотреть интерфейсы, прежде чем идти дальше с графическими интерфейсами. Но вам просто нужно подключить этот один метод, чтобы выполнить любое действие, которое вы хотите, когда информация известна.

5. Извините. Я выяснил, что было не так, я забыл передать image observer в icon.getWidth, я все еще использовал getWidth(null). Спасибо