содержание   вперед   назад

11. Описание программы Second

Файл Second.java

Перейдем к изучению основной программы. Прежде всего классы файла Second.java. Текст этого файла можно получить из файла Second.htm методом стирания нескольких строк в начале и конце файла. Посмотреть код файла в отдельном окне можно здесь. Там же записан текст файла Second.ini. Рассмотрим головной класс Second. В конечном итоге программа архивируется в один файл-архив Second.jar. То есть первым делом необходимо вынуть из этого файла все служебные файлы программы. Я так сделал, что все эти файлы находятся в папке с названием [data]. Вообще говоря, можно было бы сразу и приступать. Но вдруг кому-либо захочется переименовать название программы. И вообще, полезно было бы написать достаточно общий код, не зависящий от названия файла программы. Это можно сделать в самом общем виде. Но есть одна тонкость. В таком случае программу можно будет запускать только в полностью собранном виде, что неудобно для отладки. Я придумал следующий ход. Предположим, что программа будет помещена в отдельную папку, специально для нее созданную. В этом случае, в этой папке будет только один файл с расширением jar. В собранном виде это будет программа. А в режиме отладки это будет просто jar-файл, из которого мы будем вынимать нашу папку. Тогда нам достаточно найти имя файла с расширением jar в текущей папке. Так и сделано. Имя текущей папки . (точка). Определяем объект папку (все равно класса File) с этим именем и записываем в массив строк ml имена всех файлов данной папки. Затем проверяем имена на расширение jar (при этом используется удобная функция endsWith(text) класса String) и как только находим нужное имя, сразу запоминаем его в строке MyPro.npro на всякий случай, может еще понадобится.

Теперь мы можем спокойно вынуть из этого jar-файла папку с названием [data]. Нам достаточно режима инсталяции, поэтому целый параметр равен 2. В этой папке находятся все наши файлы, в том числе и файл Second.ini с параметрами программы. Далее нам многое знакомо. Из первой строки вынимаем название головного окна. В третьей строке у нас набит список расширений файлов с разделителем "|", с которыми будет запускаться текстовый редактор. Этот список мы передадим в массив строк MyPro.ext. В четвертой строке у нас набита изменяемая информация для редактора: имя файла, выбранного последним (строка) и два числа, равные размеру и типу используемого шрифта. Мы их вынимаем и помещаем в переменные MyPro.fn, MyPro.fs, MyPro.fk соответственно. После этого вызываем метод MyPro.init() для инициализации иконок. Они к этому времени уже находятся в папке [data]. Все остальное точно так же, как было в программе First.

В классе MainForm вам уже многое знакомо. Единственное отличие - во второй строке не 4 числа, а 8 чисел. Первые 4 мы сразу используем, а следующие 4 запоминаем в массиве MyPro.ia. Это параметры дополнительного окна редактора и браузера (будет ясно далее). Информация о разделах меню начинается с 5-й строки. Так как данная программа полностью готова для работы, то здесь тексты меню About написаны в явном виде как пример типа информации для этих разделов. Я замечу, что все можно сделать намного красивее, но часто это не требуется. И так достаточно прилично выглядит и без всяких трудов.

Файл runPro.java

Рассмотрим теперь код файла runPro.java. Сам класс runPro никак не изменился. А вот класс MainPro наполнился конкретным содержанием. В файле Second.ini заказаны следующие разделы меню

File == Open / Continue / Image / Special / Exit
Help == Menu / Editor / Browser

Они имеют номера с первого по восьмой. Имена при желании можно поменять, но смысл операций менять нельзя, так как мы их сейчас намерены реализовывать. Первый раздел меню открывает Менеджер файлов (МФ). Последний является объектом класса JFileChooser. В качестве аргумента для его конструктора можно использовать имя папки или любой файл из этой папки. Аргумент используется для указания стартовой папки, которая будет открыта в окне МФ. У этого класса есть метод setFileView(FileView) аргументом которого является объект класса FileView. Реально этот класс надо расширять и его методы переписывать, что и будет сделано позднее. Далее, у этого класса есть метод showDialog(parent,"Select") который как раз и показывает окно с именами файлов. Как и любой диалог окно должно быть приклеено к головному окну программы, а вторым аргументом является заголовок окна. В этот момент программа останавливается и ждет реакции пользователя. Пользователь должен выбрать файл или отказаться от выбора. После этого окно сворачивается и выдает результат выбора в переменную i. Если эта переменная равна статической константе JFileChooser.APPROVE_OPTION, то значит пользователь выбрал файл и можно работать.

Метод getSelectedFile() возвращает выбранный файл. Выбираем его расширение, получаем полный путь к файлу (метод getAbsolutePath() ) и сразу запоминаем его для следующего раза. В следующий раз МФ начнет именно с этой папки. Если расширение не пустое, и более того, оно равно расширению вэб страницы, запускаем в работу браузер -- это объект класса webFrame у конструктора которого два аргумента: путь к файлу и параметры окна. Если же расширение другое, то сравниваем его со всеми элементами массива расширений MyPro.ext . Так как этот массив имеет переменную длину, то необходимо в цикле определять логическую переменную ok. Если все ОК, то запускаем в работу текстовый редактор -- это объект класса fileFrame, конструктор которого имеет 4 аргумента: путь к файлу, режим записи отредактированного текста, начальную позицию курсора и параметры окна. Окно сделано как объект класса JInternalFrame и его надо приклеить к MainForm.deskt . В данной программе это уже переменная типа public static. Все достаточно просто и ясно.

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

Третий раздел меню опять использует МФ. Но здесь мы ищем файл только среди файлов картинок с расширениями gif, jpg, png. Поэтому нам надо применить метод addChoosableFileFilter() с соответствующим аргументом, который мы обсудим позднее. Так как есть фильтр, то можно дополнительно добавить и другие фильтры или режим все файлы, который у нас использовался выше по умолчанию. Метод setAcceptAllFileFilterUsed(false) как раз блокирует режим всех файлов. Нам нужны только картинки. Далее мы здесь применяем еще один новый метод setAccessory(new ImagePreview(fch)) . Этот метод добавляет в МФ окно предпросмотра картинок из файлов при выборе их одним кликом. Аргументом конструктора является сам МФ. Наконец мы устанавливаем диалог и ждем реакции пользователя. Дальше вам многое знакомо. Единственное отличие состоит в том, что выбранный файл мы передаем объекту класса butImage, который я называю слайд-проектором и который показывает картинку в окне с заголовком и в режиме диалога. Останавливать нить не нужно в данном случае, так как дальше нет кода. Да и диалог. Но в других ситуациях это может понадобиться, поэтому я на всякий случай написал.

Четвертый раздел меню - специальный поиск. Здесь МФ ищет файлы только с заданным расширением (в нашем случае это первый номер из списка расширений файла Second.ini). Если такой файл выбран, то запускается текстовый редактор. Такой режим работы используется, например, в интерпретаторе ACL, для поиска файлов с расширением acl, в которых записан код программы на языке ACL. В других ситуациях это могут быть файлы с собственным расширением программы. Напомню, что об ACL можно узнать на сайте vkacl.

Пятый раздел -- этот выход их программы. Здесь перед выходом мы формируем новое содержание 4-й строки файла Second.ini и записываем ее в файл, используя метод MyPro.writeLine() из нашего золотого фонда процедур. Остальные разделы запускают текстовый редактор в режиме отказа от записи нового содержания. То есть редактор используется только для просмотра текста. Процесс редактирования не блокируется, но текст не сохраняется. Их код полностью идентичен, только имена файлов разные.

Теперь нам надо написать используемые классы для МФ. Первый класс MyFileView является наследником FileView. Он переопределяет 5 его методов. Первые 4 метода переопределяются тривиальным образом, а 5-й метод возвращает реальную иконку для файлов с указанными расширениями, используя банк заготовленных картинок. Класс MyImgFileView тоже расширяет класс FileView, но здесь переопределяются уже два метода, то есть возвращается и иконка и тип файла. Класс MyImgFilter расширяет класс javax.swing.filechooser.FileFilter, причем необходимо указывать полный путь к классу, так как классы с именем FileFilter есть в двух из указанных нами пакетов (кроме данного еще и java.io.FileFilter). Помнить об этом необязательно, так как компилятор вам ошибку сам подскажет и вам все равно придется ее исправить. Собственно код фильтра достаточно прозрачный и комментировать особенно нечего. Метод accept возвращает логическую переменную -- показывать файл или нет, а метод getDescription возвращает строку, которая будет показана. Класс MySpFilter аналогичен предыдущему.

Более сложным является класс ImagePreview. Но разбирать его нам пока рановато. Да и нет особенной в этом нужды. Он работает и его можно ставить как есть в любую программу. Рассматривайте его как готовый класс JRE. Я хочу обратить внимание только на два метода. Первый setPreferredSize(new Dimension(200,100)) задает размеры окна для предпросмотра картинок. А второй getScaledInstance(190,-1,java.awt.Image.SCALE_DEFAULT) задает горизонтальный размер картинки для масштабирования. Вертикальный размер задан -1, что означает автоматический размер по сохранению аспектного отношения. Другими словами отношение высоты к ширине не меняется при масштабировании. Эти размеры можно менять по вашему усмотрению. Если картинка слишком высокая, то она может не поместиться в заданном размере, но это не будет ошибкой, скорее неудобство. Но здесь можно провести и более тщательный анализ и масштабировать с учетом и высоты и ширины. Кому как нравится.

Итак с программой вы разобрались. Как оказалось, все достаточно просто. Осталось изучить как же сделан редактор, браузер и слайд-проектор. А можно и не изучать. Просто использовать их как есть. Но если вам хочется улучшить конструкцию, то лучше изучить. В конце концов это интереснее, чем читать гаммы по учебнику, то есть заучивать наизусть классы и их методы.

содержание   вперед   назад


.