
3 курс (заочка) - Кроссплатформенные технологии программирования / Лабы (выполнить первые 4)
.pdf
|
Следующвашазадачая |
- сохранениетекущегоизобфранаженияктала |
|
|
диск. |
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длятоговатькол,чтобысервермогответить.