4 - Цветове, изобразяване

11 Ноем. 2010
Posted by trekto

Цветове

Подсетени от колега, решаваме да направим фона на панела, в който се рисуват фигурите ни бял. Това става от неговите настройки.

fon-cviat

Цветът при изчистване обаче също се налага да бъде сменен. А какъв е той? Ето какво пише в документацията за clearRect:

Clears the specified rectangle by filling it with the background color of the current drawing surface. This operation does not use the current paint mode.

Beginning with Java 1.1, the background color of offscreen images may be system dependent. Applications should use setColor followed by fillRect to ensure that an offscreen image is cleared to a specific color.

Аз ще сменя цвета на формата, но ако разбирате какво пише горе по-добре го направете.

forma-cviat

Нека да добавим и избор на цвят за рисуване. За целта вмъкваме нов панел, на който в настройките можем да зададем „preferredSize“ да е квадрат, примерно 25, 25. Променяме цвета му да е зелен, името му на „jPanelCurrentColor“ и добавяме очертание, както на предишния панел.

Влачим и пускаме надпис „Текущ цвят“, вляво от новия панел.

nadpis

Когато щракнем с мишката върху панела искаме да изберем цвят.

cviat-subitie

Между другото, когато използваме клас от пакет, който не сме добавили NetBeans ни подсказва да го направим, и ако щракнем на „Add import for …“ добавя класа или пакета.

paket-dobaviane

Връщаме се на избора на цвят, който ще направим чрез метода „showDialog“ от класа „JColorChooser“. Той приема като параметри родителски компонент, надпис на диалоговия прозорец и първоначален цвят, а връща цвета, който изберем.

izbor-cviat-kod

Ето го диалоговия прозорец за избор на цвят.

izbor-cviat

До сега фигурите, които рисувахме не бяха запълнени. За да променим това заменяме „drawRect“ с „fillRect“, а „drawOval“ с „fillOval“.

zapulnena-figura

Изобразяване на фигурите

Фигурите, които рисуваме все още не се запазват никъде в паметта, а изчезват като пуснем мишката.

За да променим това при пускане на мишката ще създаваме нов обект от тип „MyRectangle“ или „MyEllipse“ и ще го добавяме към масива с фигури.

Копираме кода, който пресмята координатите на фигурата и нейните ширина и височина, вземаме цвета ѝ от панела за цвят и ги подаваме като параметри на конструктора. Накрая викаме метода „GlobalVars.drawFigures()“, който да нарисува всички фигури от масива. Той е обяснен по-долу.

От метода „jPanelCanvasMouseReleased“ е премахнато извикването на метода „repaint“, защото панелът се изрисува чак, когато се обработи текущото събитие и нарисуваното от „GlobalVars.drawFigures()“ се изгубва.

dobaviane-figura

Когато сме добавили фигурите си в масива има два принципно различни начина за тяхното изобразяване. Първият от тях е през определен интервал (примерно 0,25 секунди) да обхождаме масива и да рисуваме фигурите от него.

Другият вариант е да обхождаме масива само при настъпването на определени събития, като това по-горе - пускането на бутона на мишката.

Ние ще използваме втория вариант и само когато преценим, че има промяна по изображението ще викаме метода „GlobalVars.drawFigures()“. Следва неговото тяло.

Когато искате да напишете „for“-цикъл може да напишете само „for“ и да натиснете Ctrl+Space, NetBeans ще ви предложи няколко вариант и когато изберете един от тях ще довърши кода ви.

for-cikul

Обхождаме масива и за всеки примитив в него викаме метода му „draw“, като задаваме като параметър, къде да се рисува.

risuvane-figuri

А самият метод „draw“ в „MyRectangle“ (аналогично в „MyEllipse“) изглежда така.

risuvane-figura

Тъй като цветът за рисуване тук се променя, а ние (за сега) искаме при избиране пунктира винаги да е черен, трябва да добавим „GlobalVars.graphics2D.setColor(Color.BLACK);“ в метода „jPanelCanvasMouseDragged“ преди да изрисуваме пунктира.

За да не се губи изображението ни по време на създаване на нова фигура или избиране на такава, в метода „jPanelCanvasMouseDragged“ ще заменим „GlobalVars.clearLastRect“ с „GlobalVars.drawFigures()“. Можем просто да коментираме стария код, като натиснем Ctrl+/.

komentar

Ще рисуваме фигурите и при промяна на размера на панела ни за рисуване.

preorazmeriavane

Както и когато прозорецът на програмата (формата) придобие фокус.

prozorec-fokus

В този случай направо викаме горния метод (за да не го пишем отново), като му подаваме като параметър настъпилото събитие.

prozorec-fokus-kod

След малко тестване на програмата се забелязва, че когато се максимизира прозорецът или се затвори диалоговият прозорец за избор на цвят фигурите ни изчезват. Това вероятно се получава, защото най-напред се обработва събитието (рисуват се фигурите), след което се прерисува панелът или прозорецът и нарисуваните фигури изчезват.

За да избегнем този проблем можем да забавим изрисуването на фигурите, така че то да се извършва след прерисуването на панела.

Таймер в Java

Добавяме обект от тип „Timer“ и интервал от примерно 50 милисекунди в „GlobalVars“.

subitie-risuvane

Интервалът зависи от конкретната система. Ако при вас е малък го увеличете.

Нека да напомня, че този код може да навреди на вашето развитие, като софтуерни разработчици!

Създаваме клас „DrawTask“, който да е наследник на „TimerTask“ и в реализацията на метода „run“ изрисуваме фигурите и прекратяваме таймера.

zadacha-risuvane

В метода „jPanelCanvasComponentResized“ създаваме и стартираме таймера.

Добавяме и обработка на събитието „активиране на прозореца“.

subitie-risuvane

Нека от настройките на бутона за правоъгълник да го направим да е натиснат по подразбиране.

izbran-buton

И така, стигнахме до тук.

izgled-4

Кодът до сега.

Публикувай нов коментар

  • Адресите на уеб-страници и e-mail адресите автоматично се конвертират в хипервръзки.
  • Разрешени HTML tag-ове: <a> <p> <span> <div> <h1> <h2> <h3> <h4> <h5> <h6> <img> <map> <area> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <table> <tr> <td> <em> <b> <u> <i> <strong><font> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite> <embed> <object> <param> <strike> <caption>
  • Линиите и параграфите се прекъсват автоматично.
  • Mark language-dependent sections with == lc == where lc (or lc-xx) is a language code, other or all.

Повече информация за опциите на форматиране

CAPTCHA
Image CAPTCHA