Скачиваний:
36
Добавлен:
15.02.2021
Размер:
804.3 Кб
Скачать

 

Следующвашазадачая

- сохранениетекущегоизобфранаженияктала

 

диск.

Java API предонесинсттавляетколькодляреализацииумедантнойв

 

задачи.

 

 

 

 

Во-первых,вамнужнодобавитькнопку«Saveвашеокно. Image»

 

Дляэтоговыможетедобавитькнопки«Save«Reset»вновуюImage»

 

 

Jpanel,азатемразместитьэтупанельв

SOUTH частиокна.

 

 

Событияоткнопки«SaveтакжедолжныобрабатыватьсяImage»

 

реализацией ActionListener.Назкначьтеопкам«Saveи«Reset»Image»

свои

значенияком( пр,нд«save»имер«reset»)длятого,чтобыобработчик

 

 

событиймоготличисобытияэтихдвухразькн.опокых

 

 

Вобрабкно«SaveпктчваминеобходимокеImage»реализовать

возможностьуказанияпользователем,какойфайлонбудетсо

 

хранять

изобра.Этоможсдсепнониелатьмощьюкласса

javax.swing.JFileChooser.

Указкласспредоставляетнныйметод

showSaveDialog(),которыйоткрывает

диалогокно«Saveпвотемзволяясамымпользователюfile»,выбрать

 

 

директориюдлясохранения.Метод

принимаетграфическийкомпонент,

 

котоявляетсяродитыйэледляментольскимдиалокнавыборговогом

 

 

файла,чтоп зволяетцентрированиюокнасвыборомотносительноего

 

 

родителя.Вкачестверодитеприложенияиспоокнользуйте.

 

 

Каквымоглизаметить,д

анныйметодвозврзначениетипащает

int,

котоуказываетроеезульоперациивыборафайат.Еслиметодвозвращает

 

 

значение JfileChooserтогдаможнопродолжить.APPROVEоперациюOPTION,

 

сохрфа,впрйлненияослучаетивн,пользотменилперациюватель,

 

 

поэтомузакончитеданнуюобрасобсохраненияоткуезытия.Если

 

 

пользовательвыбралдиректориюсохряф,авыможетейланенияееузнать,

 

 

используяметодgetSelectedFile(),котвозвращрыйобъекттипает.

 

 

Также необходимо

насредстроивыборафайлтьво

ов,чтобы

сохранятьизображениятолвформатеко

PNG,наданномэтапевыбудете

 

рабтосдлькотафннымть.рмасможевыэтнаспомощьютероить

 

 

javax.swing.какfilechooserэтопродемонстрировано.FileNameExtensionFilter,

ниже:

JFileChooser chooser = new JfileChooser();

FileFilter filter = new FileNameExtensionFilter("PNG Images", "png");

chooser.setFileFilter(filter);

chooser.setAcceptAllFileFilterUsed(false);

Построкаледняягарантирует,чтосредствовыборанеразрешит

пользователюисп льзованиетли

чныхот

png форматов.

Еслипользоватеуспешновыбралфай,следующимшагомь

 

являетсясохраненияизобф надискженияктала!Дляданногородазадач

 

Java

включаетсебянеобходимуюфункциональность.К

ласс

javax.обеспечивimageioпроперстые.ImageIOацет

иизагрузкисохранения

изображения.Вы

можете использовать метод write(RenderedImage im, String

formatName, File output). Параметр formatName будет содержать значение

«png”. Тип «RenderedImage» - это просто экземпляр BufferedImage из вашего

компонента JimageDisplay. (Используйтедлянеготипд ступаpublic

)

 

Метод write()можетвызватьисключ,поэтомувамнениеобходимо

 

заключитьэтотвызовблок

try/catch иобрабвозможнуюшибкутать.Блок

 

catch долженпроинформпользоватеобошчеидиарбкеоватьезля

 

говое

окно.

Swing предоставляеткласс

javax.swingдлятого,чтобы.JoptionPane

 

упропроцессозданияттьнформацидиалогокили,коннгдевыхнных

 

 

нужновыбрада/нет.Дляэтвыогоьможетеиспользоватьстатическийметод

 

 

JoptionPane.showMessageDialog(Component parent, Object message, String title, int

messageType),где messageType увасбудетJOptionPane.ERROR_MESSAGE

сообщенииошибкевыможетеиспольвозврноватьметодащаемоечение

 

 

getMessage(),азагокналможетбытьвком,например, «Cannot Sa

 

ve Image».

Родительскимкомпбудлякноненет,чготодиалоговоебымокнос

 

 

сообщениемошибкевыводилосьотносиценокна.тельнора

 

 

Послетого,каквызакончреалэтихфункцийтезацию,запустите.

 

 

Теперьвысможетеисследоватьразличныефр, кталы

также высможете

сохрихндиска.Вынятьтакжеможетепровприложениенаритьвывод

сообщенийошибках,попробуйтеизображениеранитьвфайл,который

ужесущес,нодостволькодляучтенетпен.Илвыможетеияпопробовать

сохранитьфайлименем,ко

тороеявляетсякаталогомцелевойпапк

е.

Лабораторнаяработа№6Мно. генеопоточныйфракталовтор

 

Вданнойлаборатработенеобходимобудетрнреализй вать

 

возможносрисованияфракнескталафоньлькимипо.токамивымиДва

 

преимуществаданногоподх: да

первое - пользовательскийинтерфнебудетйс

 

завпроцессеисатьрисованияновогофр,второектала

-

еслиувас

компьютермног, процессядеррисовбудетныйамногобыстреения.

 

Несмотрянато,чтомногопоточноепрограммированиеможетбытьочень

 

сложным,процессизмененияприложениябудетпрост,благодарявстроенной

 

поддержкеSwingфонпотоков. вых

 

 

Наданныймоментприложениегенефравыполнялоськталовтора

 

одномпотоке(Event

-DispatchЭтоп,котокобThread)рвсеыйабатывает.

 

событияSwing,таки

екакнажатиекнопок,перерисовка.д.Поэтому

 

разработапользовинтерфейсныйательскввремяисаетовычисленияй

 

фра;таккаквычислениеталавыполняетсяпотокеобрасоб, откиытий

 

возникающиесобытиянемогутбытьобработаныдозавершениявычислени

я.

Вэтойлабораторнработенужноизменипротакй,граммучонаьобы

 

исподинилильзованескофонпотоковлаькодлявыхчисленияфрактала.

 

Вчастно,п токбрастиобнебудетоткиытийисподляьзоваться

 

вычислфракта.Теперь, ниясливычислениеабуд

етвыполняться

нескпо,льтонеокбудразбитьаимиходимоенагонесколько

независимыхчастей.На,присованиимерфрактможндатькаждомул в

потпооднойстрокекуфракталадлявычисле.Сложзаключаетсянвияость

том,чтонеобходимособлюдатьва

жноеогранSwing,аимччтоенв иено

потокеобрасобпрооткеытвзаимодействиесходиттолькокомпонентами

SwingДляэтого.предоSwingинст,чтоавлярументыупрощает

постза.вленнуюдачу

Впрогрчавозникаютммирстоподобныепроблемывании,что

ерез

пользовинтерфейсьскапускаютдлительнуюопер,даннаяйцию

операциядолжнавыполфорежинятьсяовдляомхранения

работоспособностипользовательскогоинтерфейса.Наиболееяркпример

веб-браузеры;покастр нгружаетсяиотображаетца

ся,упользователя

должнабытьвозможностьотменитьоперац,щелкнутьссылкуиюли

 

выполнитьлюбоедругоедействие.ДлятакродапргоблемSwing

 

предоставляетклассjavaxкоторый.swingоблегчаетпроцесс.SwingWorker,

 

организациифонп . токавSwingWorkerго

- абстркл,включающийктныйсс

всебяследующиеважныеметоды:

 

doInBackground() - метод,которыйфактическивыполняетновые операции. вызыSwingэтотметвфаетопотокенд,аневпотокеом

обрасоб. откеытий

done() - этотметодвызывается,когдафон овзазавершенадачая.Он вызываетсяпотокеобрасоб,поэтомуоткиытийданномуметодуразрешено взаимодействоватьпользовательскиминтерфейсом.

КлассSwingWorkerимеетзапутаннуюспецификацию,насамомделеэто

 

 

SwingWorkerТипT

<T, V>.

- этзначеипо

ния,возвращаемогофункцией

doInBackground(),когзаполностьюдачавыполнена.ТиспользуетсяV ,

 

 

когдафоноваяз возвдачапромежуточныеащаетзначениявоврем

 

 

выполнения;этипромежзначениябудосдутточныеприисупныользовании

 

 

методовpublishи

()

processОбатипамогутнеиспользоваться(). ,таких

 

случаяхнеобуказатьObjectодлянеиспользуемоготипаимо.

Рисованиефоновомрежи е

Вданнойлабораторнойработевоснеовномобходимобудетработатьв

классеFractalExplorerЧастькодабудетновой . ,нонекоторыечастибудут представлятьизсебямодифицикод,котовыуженаписалированный.

1)СоздайтеподклассSwingWorkerименемFractalWorker,который будетвнутреннимклассомFractalExplorerЭтонеобходимодлятого,чтобыу .

негобылд кнесступ колькимвнутречленамFractalExplorerнимПомните, .

чтоклассSwingWorkerявляетсяуниверсальным,поэтомунужноуказать параметры - можнопростоуказатьObjectдлядвухпараметров,потомучто

даннойреализацэтипараметрынебудутиспольи.Врезоваться

ультатевас

 

должнаполучитьсяследующаястрк: дачка

 

 

 

private class FractalWorker extends SwingWorker<Object, Object>

 

2)КлассFractalWorkerбудетотвечатьзавычислзначцветадлянией

 

 

однойстрокифрактала,поэтемуомутребуютсядваполя:целочисл

 

еннаяy

-

координатавычисляемойстроки,массселдляпаintхранения

 

 

вычисленныхзначенийRGBдлякаждогопикэтойселятр.Кокенструктор

 

 

долженбудетполучатьy

-координатувкачествепараметрасохранятьэто.На(

 

 

данэтапеннадоомвыделятьп

амятьподцелочисленныймассив,таккакон

 

непотребуется,покастроканебудетвычислена.)

 

 

 

3) МетодdoInBackground()вызываетсяфонпотокеиотвечаетвомза

 

 

выполндлитзадачие.Поэтомуниельнойввашейреализациивамнужно

 

будет

взять частькодаизваш

предыдущейфункции«drawпомеfractal»вестить

 

 

этотметод.Вместотого,чтобырисоватьизображениеокне,циклдо

 

 

 

будетсохракаждоезначитьвсоответствующемRGBниеэлементе

 

 

целочисленногомас.Вынеиваможетеизменяотображениеэ ього

 

 

пот, очтотомукавынарушитеограниченияпотоковSwing.

 

 

 

4) Вместоэтогвыделипадлямассцтеьчлыхивначалеселв

 

 

реализацииэтогометодамассив(долженбытьдостаточнобольшимдля

 

 

 

храненияцелойстрокизначцвета),затемнийсохрани

 

тецветкаждого

 

пикселявэтоммассиве.Единственныеразличнастоящиммежду

 

 

предыдущимкодомвтом,чтовамнужнобудетвычисфракталд яить

 

 

 

указанстроки,чтовынданойэтапенобновляетеомотображение.

 

 

МетодdoInBackground()долженвозвращат

ьобъекттипаObject,таккак

 

этоуказановобъявленииSwingWorkerПростовернитеnull. <T, V>.

 

 

5) Методdone()вызывается,когдафоноваязавершенадача,иэтот

 

 

методвызываетсяизпотокаобрасобSwingоткиытийЭтоозначает,чтовы.

 

 

 

можетемодифицироват

ькомпонентыSwingнавашвкус.Поэтому

 

 

методевыможетеп ребимассивстданныхрок,атьрисуяпи,которыесели

 

быливычисленыdoInBackground ().

 

Послетого,какстрокабудетвычислена,вамнужнобудетсо бщить

 

Swing,перерисовчастьизображенить

я,которбылаизменена.Посколькуя вы

 

изменилитолькооднустроку,перерисовываизображениецеликомбудеть

 

затратно,поэтвым использоватьжетемуметодJComponentкоторый.repaint(),

 

позволитвамуказатьобластьдляперерисовки.Уданногоместьтода

 

неиспользуемыйпараметртипа

long,выможетепростоуказатьдля0этого

 

аргумента.Вкачествеостальныхп раметровукажитевычисленнуюстроку,

 

значенияначалафрагментадляперерисовки(0,конечныезначенияy)

 

фрагмента(displaySize, 1).

 

 

Послетого,каквы

завершиликлассдляфоновойзадачи,следующим

 

шагомнужнобудетпривязатьегокпроцессурисованияфра.Такталов

 

частькодаизфункции«drawужезадействовfractal»разрабатываемомна

 

классе,наданнэтапемоизмежнофункцию«drawитьа

fractal»,

именно,для

каждстрвотображйкисоздатьотдрабочиениильныйобъект,затем

 

вызватьдлянегометодexecuteЭтодействиезапустпотокфон(). ивый

 

запуститзадачувфоноврежи.Пом,чтокласснитеFractalWorkerотвечает

 

загенерациюданныхстро

кизарисованиеэтойстр,п функцияэтомуки

 

«drawдолжнабытьfractal»простой.

 

 

Послезавершенияданнойфункции,высможзаметитьотображения

 

сталоболеебыстрым,апользоватеинтерфсталб лтзывчивымеьский.йсе

 

Такжевысможзаметитеоднупроб

лемуввашемпользовательском

 

интерфейсе - есливынажметеэкраниливоопкувремяперерисовки,

 

программабработаетэтос ,бытиехдтянобытьлжнопроигнорированодо

 

завершенияоперации.

 

 

Игнорисобытийвовремяперерисовкиование

 

Самыйпростой

способрешпроблемуигнорированиять событийво

 

времяперерисовки

- отслежколичествотьостстрокавшихся,которые

 

должныбытьзавершены,иигнорилотключатьироватьвзаимодействие пользователемдотехпор,поканебудутнарисованытрокие.Дляну жно добавитьполе«rowsклассFractalremaining»ииспользоватьего,Explorer

чтобыузнать,когдабудетзавершенаперерисовка.Чтениезаписьэтого значениябудетпроисхвпотобрасодитькечтобы, откиытийнебыло

параллельногодоскэтэлеменупаому

ту.Есливзаимодействиересурсом

будетпроисходитьолькоизодного,токавозникнетошибок

параллелизма.Дляэтого:

Создайтефункциюvoid котораяenableUI(booleanбудет val),

включатьилиотключатькнопкисвыпадающимспискомпользовательском интерфейсенаосновеуказпараметра.нногоДлявключенияилиотключения

этихкомпоиспжнонентовметодльзоватьSwing setEnabled( boolean).

Убедитесь,чтовашметодобновляетстояниекнопсохранен,кнопкия

сбросаивыпадающегосписка.

Функция«draw fr

actal»должнасдещеве.Перваятьщи

- она

должнавызватьметодenableUIчтобыотключитьвсеэлементы(false),

 

 

пользовательскинтеворрисованияфейсаемя.Вт раяго

 

 

- онадолжна

установитьзначение«rowsравнымобщемуколичествуremaining»строк,

 

 

которыенужнонарисовать.Этидействиядолжныбытьсделаныперед

 

 

выполнениемкаких

-либорабочихзадач,иначеэтоможетпривестик

 

некорректнойработеалгоритма.

 

 

 

Вметодеdone(),умезньшитеачение«rowsнакак1,remaining»

последшагданнооперации.ийЗа

т,емслипослеумезначениеьш«rowsя

remaining» ра0,вызовитенометодenableUI (true).

Након,измреализациюнитеmouse -listenerдлятого,чтобына сразувозвпредыдущееращаласьсостояние,еслизнач«rowsние remaining»

неравнонулю.Другимис ловами,приложениебудетреагироватьнащелчки мышью,тольковтомслучае,еслибольшенетстрок,котдоблжныртье нарисованы.Обратите( внима,ч акжененужноиевноситьаналогичные

изменениявобработчсобыт,почтовсеомуэтикйомпонентыбуду

т

отключспомеощьюenableUIтоданы ().)

Послевыполданныхшагов,должнаенияполучитьсяпрограммадля

рисованияфракталовнескп льикоторая, кзимипретитдействия

пользователя,покапроцессрендерингапроисхвфонрежо.двомимт е

Лабораторнаяработа№7.

Веб-сканер

 

Вэтойлабораторнойработевамнеобудетреализходимовать

 

 

элемвебнтарный

-сканер.Сканербудетавтоматическизагружатьвеб

-страницы

изИнтернета,искатьновссыэтихлкистраниповторятьи.Онцахбудет

 

 

простоискатьновые

 

URL-адрм(есатоположениявеб

-стр)нкаждойниц

стран,собихвывцератькработынцедитпрограммы.Бослееожные

 

 

веб-сканерыисподиндексацльзуютсясодержИнтернетаидлялимого

 

 

очисткиадресовэлектроннпотспамачты.Есливыойгда

 

-нибудь

использопоисксистему, вовалиыответвуюназаполучалиросданные,

 

 

генерипоисковроботоуем. ыем

 

 

 

Терминология

 

 

URL:

унифицированныйуказательресурса.Этоадресвеб

-

стра.Оименслицыедующуют

 

структуру:

 

1)методдоступакресурсу;

2)доменноеим я

3)путькфайлу

4)данныеофайле

Вданнойлабораторнойработебудетрассмметодступатрен«http://».

 

 

HTTP: Hyper Text Transfer Protocol

(Протоколпередачи

гипер)Этостандар. екстатекстпр,испоныйтоколвыйд ьзуемыйя

 

 

передачиданныхвеб

 

-страницы черезИнтерн.Посплетднейцификацией

 

HTTP являетсяверси1которую.1,будетиспользованаданнойлабораторной

 

 

работе.

 

 

 

 

Сокет:

Сокет(разъем)

- эторесурс,предоперационнойставляемый

 

системой,котп рыйзволяетвамобмениватьсяданнымидругими

 

 

компьютерамипосети.Выможетеиспользоватьсокетдляус ановки

 

 

соединениявеб

 

-сер,новдолжныеромиспользоватьTCP

-сокети

использпротHTTPдлятоговатькол,чтобысервермогответить.