#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). Спасибо