[Назад]  

Виктор Кон,   vkBook, Java-First

Дополнение (Java-1.2.2)

В разобранной программе мы существенно использовали пакет SWING, который появился в Java2, начиная с версии 1.2.0. Интересно, а можно ли прокомпилировать программу с компилятором версии 1.2.2, который до сих пор можно скачать с сайта Java. Оказывается, что в исходном виде - нельзя, так как в нескольких местах использовались возможности, появившиеся в более поздних версиях. Но если слегка модифицировать код, отказавшись от этих возможностей, то можно. Более того, в рассмотренной программе использование более поздних версий совсем не требуется и было сделано просто для ознакомления с полезными классами.

Итак рассмотрим по порядку что следует изменить. Во-первых, содержание командного (batch) файла для компиляции программы с выводом диагностики в файл следует изменить на указанное ниже
set path=c:\jdk122\bin;%path%
javac.exe -Xstdout First.java > diag.txt
pause
Здесь указана другая папка компилятора и имя файла записано в конце так как ключ -Xstdout не имеет параметра и только перенаправляет поток ошибок в системный поток.

В первом классе (First) надо строку
mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
заменить на строку
mf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Фактически аргументом этого метода являются целые числа 0,1,2 в версии 1.2.2, которые описаны в интерфейсе WindowConstants. В частности константа DISPOSE_ON_CLOSE имеет значение 2. В последующих версиях появилось значение 3, записанное в классе JFrame и названное EXIT_ON_CLOSE. Мы могли бы с равным успехом использовать значение 2 в нашей программе с самого начала, но 3 лучше. В версии 1.2.2 однако выбора нет.

Во втором классе (MainForm) следует поменять код
fn="icon.png";
BufferedImage bi = javax.imageio.ImageIO.read(new File(fn));
setIconImage(bi);
на следующий код
fn="icon.gif"; setIconImage(new ImageIcon(fn).getImage());
Дело в том, что пакета "javax.imageio.*" в версии 1.2.2 еще нет, а следовательно нет и использованного класса. Этот класс полезен тем, что позволяет сразу получить объект класса BufferedImage, то есть картинку в виде матрицы пикселей. Но для установки иконки нам этот класс не требуется. Нам достаточно объекта класса Image, а последний можно получить из объекта класса ImageIcon методом getImage(). Конструктор этого класса позволяет создать объект прямо из файла при указании имени файла как аргумент. Ну и для надежности лучше конвертировать формат png в формат gif. У меня на компьютере при использовании формата png компилятор ошибок не выдал, но картинка не показывалась.

Далее, следует исключить строку
deskt.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
так как в версии 1.2.2 у объектов класса JDesktopPane еще нет такого метода. При этом, однако, все работает точно так же, как было описано ранее, в автоматическом режиме.

В файле runPro, в классе MainPro надо снова заменить имя файла "icon.png" на "icon.gif", а в классе imagFrame надо заменить следующий код
try{big = javax.imageio.ImageIO.read(fs);}
catch(IOException ex){ex.printStackTrace();}
Image im = big; ImageIcon img = new ImageIcon(im); lab = new JLabel(img);
в котором снова используется класс javax.imageio.ImageIO на код, в котором используется другой конструктор класса ImageIcon, а именно,
ImageIcon img = new ImageIcon(fn); lab = new JLabel(img);
Обратите внимание, что последний код даже проще, так как нам нужен только объект класса ImageIcon и больше ничего. Разница в том, что первый код позволяет сразу узнать размеры картинки, в то время как второй этой информации не дает. Но так как мы использовали метод pack(), то нам размеры не понадобились. Однако в более сложных ситуациях их придется узнавать, вынимая картинку (объект класса Image) из объекта класса ImageIcon.

Это все изменения. Теперь программа прокомпилируется с компилятором версии 1.2.2. Единственное замечание. Этот компилятор предупреждает, что мы использовали класс MainForm в другом файле, а он не описан как public. Но это только предупреждение, реально все нормально работает. Компилятор версии 1.4.2 уже не делает таких предупреждений.

Вот и закончилась первая серия моих лекций, в которой вы научились оформлять внешний вид программы в виде головного окна с меню. Такой вид имеют много программ, но не все. Кроме того, за бортом осталось огромное количество готовых классов виртуальной машины Java, которые позволяют сразу получать решение многих проблем без собственного программирования. Чем больше готовых классов вы используете, тем короче будет ваша программа и тем проще будет передавать ее по электронной почте или скачивать из интернета. Так как установка виртуальной машины все равно необходима и делается только один раз, как дополнение к вашей операционной системе, то использование готовых классов не только облегчает программирование, но и уменьшает размер программы. В следующих сериях я попробую в таком же стиле описать некоторые другие классы JVM из тех, которые я сам знаю. Увы все классы описать невозможно, да видимо полное число классов вообще мало кто знает. На каком-то этапе необходимо научиться пользоваться API или прямым кодом классов. Специфика Java технологии в ее полной открытости. Код всех классов доступен разработчику. Так что следите за новостями на моем сайте vkacl.narod.ru. А пока до свидания и успехов !


[Назад]  
Hosted by uCoz