ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ прилоТСния Β«Π”ΠΎΠΌΠΈΠ½ΠΎΒ»

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π­Ρ‚Π° схСма каТСтся слишком слоТной, Π½ΠΎ Π΅ΠΉ Ρ‡Π°ΡΡ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΆΠΈΠ·Π½ΠΈ. Допустим, ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΠ» ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Ρƒ. Он ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² Π½Π΅Π΅, ΠΊΠ°ΠΊ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹: мСбСль, сантСхнику, элСктронику, Π°Π½Ρ‚ΠΈΠΊΠ²Π°Ρ€ΠΈΠ°Ρ‚. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ нСприятноС событиС — ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Ρƒ посСтят Π²ΠΎΡ€Ρ‹, — ΠΈ Ρ…озяин Ρ…ΠΎΡ‡Π΅Ρ‚ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ классы-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ этого события — ΠΎΡ…Ρ€Π°Π½Π½Ρ‹Π΅ агСнтства… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ прилоТСния Β«Π”ΠΎΠΌΠΈΠ½ΠΎΒ» (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

ГосударствСнноС ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΡƒΡ‡Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ образования

«Π‘Π°Π½ΠΊΡ‚-ΠŸΠ΅Ρ‚Π΅Ρ€Π±ΡƒΡ€Π³ΡΠΊΠΈΠΉ государствСнный ΠŸΠΎΠ»ΠΈΡ‚Π΅Ρ…Π½ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ унивСрситСт»

Π˜Π½ΠΆΠ΅Π½Π΅Ρ€Π½ΠΎ-экономичСский институт ΠšΠ°Ρ„Π΅Π΄Ρ€Π° «Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы Π² ΡΠΊΠΎΠ½ΠΎΠΌΠΈΠΊΠ΅ ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½Ρ‚Π΅»

ΠšΠ£Π Π‘ΠžΠ’ΠžΠ™ ΠŸΠ ΠžΠ•ΠšΠ’ По Π΄ΠΈΡΡ†ΠΈΠΏΠ»ΠΈΠ½Π΅ «ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅»

На Ρ‚Π΅ΠΌΡƒ: Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ прилоТСния «Π”ΠΎΠΌΠΈΠ½ΠΎ»

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»: студСнт Π³Ρ€. 1074/2

Π“Ρ€ΠΎΠΌΠΎΠ²Π° М.Π’.

ΠŸΡ€ΠΈΠ½ΡΠ»:Π΄ΠΎΡ†Π΅Π½Ρ‚ Π§Π°Π½Ρ†Π΅Π² Π’.П.

Π‘Π°Π½ΠΊΡ‚-ΠŸΠ΅Ρ‚Π΅Ρ€Π±ΡƒΡ€Π³

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

1. ГрафичСский интСрфСйс Π² Java

1.1 Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ графичСского интСрфСйса

1.2 Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ элСмСнтов графичСского интСрфСйса

1.3 ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий Π² Π³Ρ€Π°Ρ„ичСском интСрфСйсС

2. РСшСниС практичСской Π·Π°Π΄Π°Ρ‡ΠΈ «Π”ΠΎΠΌΠΈΠ½ΠΎ»

2.1 ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

2.2 ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ дСкомпозиция классов

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Бписок Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 1. ВСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 2. ВСстовый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ЦСлью Π΄Π°Π½Π½ΠΎΠ³ΠΎ курсового ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° являСтся написаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ «Π”ΠΎΠΌΠΈΠ½ΠΎ», Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ графичСский интСрфСйс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΡƒΡŽ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ поставлСнной Ρ†Π΅Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ:

Π˜Π·ΡƒΡ‡ΠΈΡ‚ΡŒ особСнности графичСских интСрфСйсов Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Java;

Π’Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ рСализуСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Java;

ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ Ρ…ΠΎΠ΄Π΅ создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, основныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ языка Java. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ проста ΠΈ ΠΏΠΎΠ½ΡΡ‚Π½Π°.

Π’ ΡΠΎΠΎΡ‚вСтствии с ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру:

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ графичСских интСрфСйсов Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Java (элСмСнты графичСских интСрфСйсов, ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий);

ОписаниС ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π“Π»Π°Π²Π° 1. ГрафичСский интСрфСйс Π² Java

1.1 Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ графичСского интСрфСйса Π’ Java Π΅ΡΡ‚ΡŒ Π΄Π²Π° основных ΠΏΠ°ΠΊΠ΅Ρ‚Π° для создания графичСских интСрфСйсов (Graphics User Interface). Π­Ρ‚ΠΎ Abstract Windows Toolkit (AWT) ΠΈ Swing. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌΡΡ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΈΡ… Π½ΠΈΡ….

AWT — Π½Π°Π±ΠΎΡ€ классов Java, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ элСмСнта графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (GUI). ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ всС классы Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ абстрактного класса Component. Π›ΠΈΡˆΡŒ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты мСню Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса — MenuComponent. Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ элСмСнты прСдставлСны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ классами:

? Button (ΠΊΠ½ΠΎΠΏΠΊΠ°);

? Checkbox (ΠΊΠ½ΠΎΠΏΠΊΠ° с Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠΉ фиксациСй);

? Choice (Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉΡΡ список Windows);

? Label (строка);

? List (список Π²Ρ‹Π±ΠΎΡ€Π° Windows);

?Scrollbar (полоса ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ).

Π­Ρ‚ΠΎ достаточно простыС классы, наслСдуСмыС ΠΎΡ‚ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΠΎΠ³ΠΎ класса Component Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.

Однако Π² ΡΠΎΡΡ‚Π°Π²Π΅ java. awt ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ классы интСрфСйсных элСмСнтов, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ°. Π₯ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚ΠΎΠΌΡƒ являСтся класс Panel для создания Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ°Π½Π΅Π»Π΅ΠΉ. Π£ Π½Π΅Π³ΠΎ имССтся ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ абстрактный класс-ΠΏΡ€Π΅Π΄ΠΎΠΊ Container, слуТащий Ρ€ΠΎΠ΄ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΈΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΈΡ… классов-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², способных ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² ΡΠ΅Π±Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты интСрфСйса. ΠžΡ‚ ΡΡ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса наслСдуСтся класс ΠΎΠΊΠ½Π° Window, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π½Π° ΡΠΊΡ€Π°Π½Π΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅ ΠΎΠΊΠ½ΠΎ Π±Π΅Π· мСню ΠΈ Ρ€Π°ΠΌΠΊΠΈ. Π£ ΡΡ‚ΠΎΠ³ΠΎ класса Π΅ΡΡ‚ΡŒ Π΄Π²Π° часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°: Dialog, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ само Π·Π° ΡΠ΅Π±Ρ, ΠΈ Frame — стандартноС ΠΎΠΊΠ½ΠΎ Windows. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ класс TextComponent ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π΄Π²Π° ΠΏΠΎΠ»Π΅Π·Π½Π΅ΠΉΡˆΠΈΡ… Π² Ρ€Π°Π±ΠΎΡ‚Π΅ класса — TextField (Π°Π½Π°Π»ΠΎΠ³ строки Π²Π²ΠΎΠ΄Π° Windows) ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ тСкстового Π²Π²ΠΎΠ΄Π° TextArea. Особняком ΠΎΡ‚ Π²ΡΠ΅Ρ… элСмСнтов стоит класс Canvas. Π•Π³ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ прСдставлСниС — пустой ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ рисованиС ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ события наТатия ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ.

ΠžΡ‚ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ° Component всС Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты ΠΏΠ΅Ρ€Π΅Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π΅ для Π½ΠΈΡ… всСх ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, связанноС с ΠΈΡ… Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ сторонами. Π’ΠΎΡ‚ список основных, выполняСмых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

?ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡˆΡ€ΠΈΡ„Ρ‚Π° — ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ getFont, setFont, getFontMetrics;

?ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° ΡˆΡ€ΠΈΡ„Ρ‚Π° — ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ setForeground (Color) ΠΈ getForeground () — для установки ΠΈ Ρ‡Ρ‚Сния Ρ†Π²Π΅Ρ‚Π° самого ΡˆΡ€ΠΈΡ„Ρ‚Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ setBackground (Color) ΠΈ getBackground () для установки, Π° Ρ‚Π°ΠΊΠΆΠ΅ чтСния Ρ†Π²Π΅Ρ‚Π° Ρ„ΠΎΠ½Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ отобраТаСтся тСкст;

?Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡ Π½Π° ΡΠΊΡ€Π°Π½Π΅ — ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ preferredSize () ΠΈ minimumSize () ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ раскладок ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, соотвСтствСнно;

?ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° — ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ paint (), update () ΠΈ repaint ();

?ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСний — ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ handleEvent (), action (), keyDown (), keyUp (), mouseDown (), mouseUp (), mouseDrag (), mouseMove (), mouseEnter () ΠΈ mouseExit ().

1.2 Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ элСмСнтов графичСского интСрфСйса Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ располоТСниСм элСмСнтов Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠΊΠΎΠ½-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², Π² Java сущСствуСт ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ раскладок (layout manager). ΠžΡ‚ Π½Π΅Π³ΠΎ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΏΡΡ‚ΡŒ классов, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Ρ‚ΠΈΠΏ располоТСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса Π² ΠΎΠΊΠ½Π΅. Когда трСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ располоТСния, создаСтся Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ класс раскладки, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ запросам ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈ ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ся Π² Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ setLayout (), ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ раскладку:

// Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ располоТСниС элСмСнтов вдоль Ρ€Π°ΠΌΠΊΠΈ ΠΎΠΊΠ½Π°

setLayout (new BorderLayout ());

Π”Π°Π΄ΠΈΠΌ ΠΊΡ€Π°Ρ‚ΠΊΡƒΡŽ характСристику классам-раскладкам.

FlowLayout. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ располоТСния элСмСнтов ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ, примСняСмый ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Когда Π² ΠΎΠ΄Π½ΠΎΠΉ строкС ΡƒΠΆΠ΅ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ся Π½ΠΎΠ²Ρ‹Π΅ элСмСнты, Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ продолТаСтся с Π½ΠΎΠ²ΠΎΠΉ строки.

CardLayout. ΠŸΡ€ΠΈ раскладкС этого Ρ‚ΠΈΠΏΠ° элСмСнты Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΊΠ°Ρ€Ρ‚Ρ‹ Π² ΠΊΠΎΠ»ΠΎΠ΄Π΅. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ расклад ΡƒΠ΄ΠΎΠ±Π΅Π½, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ динамичСски ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ интСрфСйс ΠΎΠΊΠ½Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ элСмСнты Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ΄ΠΈΠ½ Π½Π°Π΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

BorderLayout. Π­Ρ‚Π° раскладка Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ элСмСнты Π»ΠΈΠ±ΠΎ рядом с Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ ΠΊΡ€Π°Π΅ΠΌ ΠΎΠΊΠ½Π°, Π»ΠΈΠ±ΠΎ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅. Для этого послС установки BorderLayout Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнтов Π² ΠΎΠΊΠ½ΠΎ-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ производится ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ add () с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΌ строками North, South, East, West ΠΈ Center. КаТдая ΠΈΠ· Π½ΠΈΡ… ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΊΡ€Π°ΠΉ ΠΎΠΊΠ½Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠΆΠ°Ρ‚ΡŒ вставляСмый элСмСнт.

GridLayout располагаСт элСмСнты ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ условной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ВсС элСмСнты Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π Π°Π·ΠΌΠ΅Ρ€ ячССк ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ.

GridBagLayout. Π­Ρ‚ΠΎ самая мощная раскладка. Она располагаСт элСмСнты Π² ΡƒΡΠ»ΠΎΠ²Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΊΠ°ΠΊ это дСлаСтся Π² ΡΠ»ΡƒΡ‡Π°Π΅ с GridLayout. Но Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ, Π² ΡΡ‚ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ся Π½Π°Π±Ρ€Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ ΠΎΠ΄Π½Ρƒ строчку исходного тСкста.

1.3 ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий Π² Π³Ρ€Π°Ρ„ичСском интСрфСйсС Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ (event) Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ AWT Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ воздСйствии Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ манипуляциями ΠΌΡ‹ΡˆΡŒΡŽ, ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠΊΠ½Π°, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ².

ΠžΠ±ΡŠΠ΅ΠΊΡ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ событиС, называСтся источником (source) события.

ВсС события Π² AWT классифицированы. ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ события ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ систСма Java автоматичСски создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΡŽ класса. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий, ΠΎΠ½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ всС свСдСния ΠΎ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΠΈ.

Π’ΠΎ Π³Π»Π°Π²Π΅ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов-событий стоит класс Eventobject ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° java. util — нСпосрСдствСнноС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ класса object. Π•Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ абстрактный класс AWTEvent ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° java. awt — Π³Π»Π°Π²Π° классов, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… события Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ AWT. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ°Ρ иСрархия классов-событий ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° Ρ€ΠΈΡ. 1.1. ВсС классы, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹Π΅ Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅, ΠΊΡ€ΠΎΠΌΠ΅ класса AWTEvent, собраны Π² ΠΏΠ°ΠΊΠ΅Ρ‚ java.awt.event.

Бобытия Ρ‚ΠΈΠΏΠ° ComponentEvent, FocusEvent, KeyEvent, MouseEvent Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π²ΠΎ Π²ΡΠ΅Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ….

А ΡΠΎΠ±Ρ‹Ρ‚ия Ρ‚ΠΈΠΏΠ° ContainerEvent — Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…: Container, Dialog, FileDialog, Frame, Panel, ScrollPane, Window.

Рис. 1. Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ классов, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… события AWT

Бобытия Ρ‚ΠΈΠΏΠ° WindowEvent Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π’ΠžΠ›Π¬ΠšΠž Π² ΠΎΠΊΠ½Π°Ρ…: Frame, Dialog, FileDialog, Window.

Бобытия Ρ‚ΠΈΠΏΠ° TextEvent Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… TextComponent, TextArea, TextField.

Бобытия Ρ‚ΠΈΠΏΠ° ActionEvent ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… Button, List, TextField.

Бобытия Ρ‚ΠΈΠΏΠ° ItemEvent Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… Checkbox, Choice, List.

НаконСц, события Ρ‚ΠΈΠΏΠ° AdjustmentEvent Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Scrollbar.

Π£Π·Π½Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ событиС, ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ getsource класса Eventobject. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ object.

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΡ‚ΠΈΡ… классов-событий ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ paramstring (), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ содСрТимоС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса Π² Π²ΠΈΠ΄Π΅ строки string. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ классС Π΅ΡΡ‚ΡŒ свои ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Π΅ свСдСния ΠΎ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΠΈ.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий описаны Π² ΠΈΠ½Ρ‚СрфСйсах-ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡΡ… (listener). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° Ρ€ΠΈΡ. 1.1 Ρ‚ΠΈΠΏΠ° событий, ΠΊΡ€ΠΎΠΌΠ΅ InputEvent (это событиС Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ), Π΅ΡΡ‚ΡŒ свой интСрфСйс. ИмСна интСрфСйсов ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ события ΠΈ ΡΠ»ΠΎΠ²Π° Listener, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ActionListener, MouseListener. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ интСрфСйса «ΡΠ»ΡƒΡˆΠ°ΡŽΡ‚», Ρ‡Ρ‚ΠΎ происходит Π² ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ источникС события. ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ события эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ автоматичСски Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, получая Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-событиС ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ свСдСния ΠΎ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΠΈ, содСрТащиСся Π² ΡΡ‚ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ события ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π½Π°Π΄ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс. ΠšΠ»Π°ΡΡΡ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ интСрфСйс, классы-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ (handlers) события, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡΠΌΠΈ (listeners): ΠΎΠ½ΠΈ «ΡΠ»ΡƒΡˆΠ°ΡŽΡ‚», Ρ‡Ρ‚ΠΎ происходит Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ события ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ события, классы-источники события Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ссылку Π½Π° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ€ EventHandler класса-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° события ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² addXxxListener (XxxEvent eventHandier), Π³Π΄Π΅ Π₯Ρ…Ρ… — имя события.

Π’Π°ΠΊΠΎΠΉ способ рСгистрации, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ оставляСт «Π²ΠΈΠ·ΠΈΡ‚Π½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΡƒ» источнику для своСго Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΈ наступлСнии события, называСтся ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² (callback). ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ дСйствиС — ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΡ — выполняСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ removeXxxListener ().

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚-источник, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ событиС, Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ся Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ. Он ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚ся ΠΊ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ€Ρƒ класса-ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Ρ, ΡƒΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ события, Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ (delegate) Π΅ΠΌΡƒ полномочия ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

Вакая схСма ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ схСмы дСлСгирования (delegation). Она ΡƒΠ΄ΠΎΠ±Π½Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ класс-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ событиС ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΈΠ»ΠΈ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ нСсколько ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ события. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-источников событий.

Π­Ρ‚Π° схСма каТСтся слишком слоТной, Π½ΠΎ Π΅ΠΉ Ρ‡Π°ΡΡ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΆΠΈΠ·Π½ΠΈ. Допустим, ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΠ» ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Ρƒ. Он ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² Π½Π΅Π΅, ΠΊΠ°ΠΊ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹: мСбСль, сантСхнику, элСктронику, Π°Π½Ρ‚ΠΈΠΊΠ²Π°Ρ€ΠΈΠ°Ρ‚. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ нСприятноС событиС — ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Ρƒ посСтят Π²ΠΎΡ€Ρ‹, — ΠΈ Ρ…озяин Ρ…ΠΎΡ‡Π΅Ρ‚ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ классы-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ этого события — ΠΎΡ…Ρ€Π°Π½Π½Ρ‹Π΅ агСнтства, — Ρ‚ΠΎΠ³Π΄Π° слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ экзСмпляру Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹-источники события, Ρ‚. Π΅. Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΡ€Π°Π΄Π΅Π½Ρ‹, ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ ΠΊ ΡΠ΅Π±Π΅ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ addXxxListener (). Π—Π°Ρ‚Π΅ΠΌ экзСмпляр-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ «ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚», Ρ‡Ρ‚ΠΎ происходит Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½. Он Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° Π½Π°ΡΡ‚ΡƒΠΏΠ»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ события — похищСния ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, — ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ события, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Ρ‹Π² Π²ΠΎΠ΄ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Ρ€ΡƒΠ±Ρ‹, Π΅Π³ΠΎ Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚. ΠŸΡ€ΠΈ наступлСнии «ΡΠ²ΠΎΠ΅Π³ΠΎ» события ΠΎΠ½ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ, записанному Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π“Π»Π°Π²Π° 2. РСшСниС практичСской Π·Π°Π΄Π°Ρ‡ΠΈ «Π”ΠΎΠΌΠΈΠ½ΠΎ»

2.1 ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ Π‘ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая Ρ€Π°Π·Π΄Π°Π΅Ρ‚ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌ кости для ΠΈΠ³Ρ€Ρ‹ Π² Π΄ΠΎΠΌΠΈΠ½ΠΎ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ³Ρ€Ρƒ. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ кости Π΄ΠΎΠΌΠΈΠ½ΠΎ. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ — выставлСниС кости Π² Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΊΠΎΠ½Π΅Ρ† ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ костСй. ΠŸΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ситуации «Ρ€Ρ‹Π±Π°» .

2.2 ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ дСкомпозиция классов

Рассмотрим ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π½Π° Π ΠΈΡΡƒΠ½ΠΊΠ΅ 2 Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ классов.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ потрСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ класс костСй — Bone, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π΄Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ поля:

Поля X ΠΈ Y — ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ†Π΅Π½Ρ‚Ρ€Π° кости Π΄ΠΎΠΌΠΈΠ½ΠΎ Π½Π° ΡΠΊΡ€Π°Π½Π΅.

Поля dirX ΠΈ dirY — Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ располоТСна ΠΊΠΎΡΡ‚ΡŒ Π΄ΠΎΠΌΠΈΠ½ΠΎ Π½Π° ΡΠΊΡ€Π°Π½Π΅.

Поля points1 ΠΈ points2 — ΠΎΡ‡ΠΊΠΈ Π½Π° ΠΊΠΎΡΡ‚ΠΈ Π΄ΠΎΠΌΠΈΠ½ΠΎ с Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ стороны.

Π’ ΡΡ‚ΠΎΠΌ ΠΆΠ΅ классС описан ΠΌΠ΅Ρ‚ΠΎΠ΄ show (), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСт ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ кости Π΄ΠΎΠΌΠΈΠ½ΠΎ Π½Π° ΡΠΊΡ€Π°Π½Π΅.

ΠšΡ€ΠΎΠΌΠ΅ класса Bone Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ создан класс MainFrame, наслСдник класса Frame.

Π’ ΠΊΠ»Π°ΡΡΠ΅ MainFrame описан конструктор ΠΎΠΊΠ½Π° прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вызываСтся Π² ΡΡ‚атичСском ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ main ().

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ main () Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ конструктор для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-костСй Π΄ΠΎΠΌΠΈΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ заносятся Π² ArrayListplayerBones. Π’ ΡΡ‚ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ вызываСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ (Listener) ΠΊΠ½ΠΎΠΏΠΎΠΊ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «ΠΠ°Ρ‡Π°Ρ‚ΡŒ» запускаСтся отрисовка костСй Π΄ΠΎΠΌΠΈΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Ρ€ΠΎΠ·Π΄Π°Π½Ρ‹ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΡ‚, Ρƒ ΠΊΠΎΠ³ΠΎ Π½Π° Ρ€ΡƒΠΊΠ°Ρ… ΠΊΠΎΡΡ‚ΡŒ {1, 1}. Π”Π°Π»Π΅Π΅ ΠΈΠ³Ρ€ΠΎΠΊΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ Ρ…ΠΎΠ΄Ρ‹, постСпСнно выстраиваСтся Ρ†Π΅ΠΏΡŒ. Π˜Π³Ρ€Π° продолТаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΡΡ‚ΡƒΠΏΠΈΡ‚ ситуация «Π Ρ‹Π±Π°» ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π½Π΅ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ся ΠΎΡ‚ Π²ΡΠ΅Ρ… Ρ„ΠΈΡˆΠ΅ΠΊ Π½Π° ΡΠ²ΠΎΠΈΡ… Ρ€ΡƒΠΊΠ°Ρ….

Рис. 2. Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° классов Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π’ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½ΠΎΠΌ курсовом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π±Ρ‹Π»ΠΈ рассмотрСны основныС понятия языка программирования Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ°ΡΠ°ΡŽΡ‚ΡΡ графичСских интСрфСйсов, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: основныС элСмСнты графичСского интСрфСйса, ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий.

На Java Π½Π°ΠΌΠΈ Π±Ρ‹Π»Π° написана ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ «Π”ΠΎΠΌΠΈΠ½ΠΎ».

Данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ осущСствляСт ΠΈΠ³Ρ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ управляСт лишь ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Π’ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π²ΠΈΡ‚ΡŒ это ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ³Ρ€Ρ‹ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ сСти.

Бписок Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹

Π’Π°ΡΠΈΠ»ΡŒΠ΅Π² А. Н. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для магистров ΠΈ Π±Π°ΠΊΠ°Π»Π°Π²Ρ€ΠΎΠ²: Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ курс ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. — Π‘Π°Π½ΠΊΡ‚-ΠŸΠ΅Ρ‚Π΅Ρ€Π±ΡƒΡ€Π³, ΠŸΠΈΡ‚Π΅Ρ€, 2011 Π³ — 396 с.

Π‘Ρ€ΡŽΡ ЭккСль. Ѐилософия Java. — Π‘Π°Π½ΠΊΡ‚-ΠŸΠ΅Ρ‚Π΅Ρ€Π±ΡƒΡ€Π³, ΠŸΠΈΡ‚Π΅Ρ€, 2009 Π³- 640 с.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 1. ВСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ интСрфСйс ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠΈΠ½ΠΎ

package domino;

import java.awt.*;

/ * класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Π΅Ρ‚ ΠΊΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΊ графичСски, Ρ‚Π°ΠΊ ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΈ

public class Bone {

static final byte width = 32;

static final byte height = width * 2;

static final byte pointSize = 6;

static final Color colorMarked = Color. RED;

static final Color colorBack = Color. WHITE;

static final Color colorPoint = Color. BLUE;

private byte points1, points2;

private int X, Y;

private byte dirX, dirY;

static byte[][][] pointCoords = {

{},

{{0, 0}},

{{-1, -1}, {+1, +1}},

{{-1, -1}, {0, 0}, {+1, +1}},

{{-1, -1}, {+1, -1}, {-1, +1}, {+1, +1}},

{{-1, -1}, {+1, -1}, {-1, +1}, {+1, +1}, {0, 0}},

{{-1, -1}, {+1, -1}, {-1, +1}, {+1, +1}, {0, -1}, {0, +1}}

};

private boolean isMarked;

Bone (byte p1, byte p2) {

points1 = p1;

points2 = p2;

isMarked = false;

}

int getX () {

return X;

}

int getY () {

return Y;

}

/**

* ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎ X

*/

int getSizeX () {

if (dirX ≠ 0) {

return height;

} else {

return width;

}

}

Bone setColorMarked () {

isMarked = true;

return this;

}

Bone setColorUsual () {

isMarked = false;

return this;

}

/**

* ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎ Y

*/

int getSizeY () {

if (dirX ≠ 0) {

return width;

} else {

return height;

}

}

/**

* ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‡ΠΊΠΎΠ² со ΡΡ‚ΠΎΡ€ΠΎΠ½Ρ‹

*/

byte points (int side) {

if (side == 0) {

return points1;

}

if (side == 1) {

return points2;

}

return -1;

} /**

* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ размСрности кости Π½Π° ΡΠΊΡ€Π°Π½Π΅ для опСрСдСлСния области прикосновСния

*/

int[] getBounds () {

int sx = getSizeX (), sy = getSizeY ();

return new int[]{X — sx / 2, X + sx / 2, Y — sy / 2, Y + sy / 2};

}

/**

* ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΊΠΎΡΡ‚ΡŒ

*/

void show (Graphics G) {

int sx = getSizeX (), sy = getSizeY ();

G.setColor (colorBack);

G.fillRect (X — sx / 2, Y — sy / 2, sx, sy);

if (isMarked) {

G.setColor (colorMarked);

} else {

G.setColor (colorPoint);

}

G.drawRect (X — sx / 2, Y — sy / 2, sx — 1, sy — 1);

G.setColor (colorPoint);

if (dirX ≠ 0) {

G.drawLine (X, Y — sy / 2 + 3, X, Y + sy / 2 — 4);

} else {

G.drawLine (X — sx / 2 + 3, Y, X + sx / 2 — 4, Y);

}

int x1 = X — dirX * sx / 4, y1 = Y — dirY * sy / 4;

for (int s = 1; s <= 2; s++) {

int p = points1;

if (s == 2) p = points2;

for (int i = 0; i < p; i++) {

//int d=width*i/(p+1)-pointSize/2;

int dx = pointCoords[p][i][0] * width / 4;

int dy = pointCoords[p][i][1] * width / 4;

G.fillOval (x1 + dx — pointSize / 2, y1 + dy — pointSize / 2,

pointSize, pointSize);

}

x1 += dirX * sx / 2;

y1 += dirY * sy / 2;

}

}

/**

* Π‘ΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡΡ‚ΡŒ

*/

void hide (Graphics G, Color back) {

G.setColor (back);

int sx = getSizeX (), sy = getSizeY ();

G.fillRect (X — sx / 2, Y — sy / 2, sx, sy);

}

/**

* ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ кости Π½Π° Π΄ΠΎΡΠΊΠ΅

*/

void moveTo (int x, int y, Graphics G, Color back) {

hide (G, back);

this.X = x;

this.Y = y;

show (G);

}

/**

* ΠŸΠΎΠ²ΠΎΡ€ΠΎΡ‚ кости Π½Π° Π΄ΠΎΡΠΊΠ΅

*/

void rotate (int dirX, int dirY, Graphics G, Color back) {

assert dirX >= -1 && dirX <= +1 && dirY >= -1 && dirY <= +1;

hide (G, back);

this.dirX = (byte) dirX;

this.dirY = (byte) dirY;

show (G);

}

/**

* ПлавноС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ кости Π½Π° Π΄ΠΎΡΠΊΠ΅

*/

void moveSliding (int x2, int y2, int time, Graphics G, Color back) {

int x1 = getX (), y1 = getY ();

int dt = 1000 / 25;

int n = time / dt;

for (int p = 1; p <= n; p++) {

int xp = x1 + (x2 — x1) * p / n;

int yp = y1 + (y2 — y1) * p / n;

moveTo (xp, yp, G, back);

long t = System. currentTimeMillis ();

do {

} while (System.currentTimeMillis () — t < dt);

}

}

}

package domino;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.ArrayList;

import java.util.Timer;

import java.util.TimerTask;

public class MainFrame extends Frame {

private Graphics graphics;

private Color backgroundColor;

private final static int PLAYERS_COUNT = 4;

private final static int MAX_BONES_COUNT = 7;

private final static int MAX_BONE_VALUE = 6;

private int currentPlayerIdx;

private int passesCount = 0;

private int[] placeJ = new int[2];

private int[] placeK = new int[2];

private int[] rotationJ = new int[2];

private int[] rotationK = new int[2];

private byte[] endPoints = new byte[2];

private ArrayList[] playersBones = new ArrayList[PLAYERS_COUNT];

private ArrayList bonesOnTheDesk;

private boolean selected;

private int selectedIdx;

private boolean gameStarted;

private boolean isHandling;

private boolean isChoosingBone;

private int selectedOnBoard;

public MainFrame () {

initComponents ();

graphics = this. getGraphics ();

backgroundColor = getBackground ();

}

/**

* Π‘Ρ‚Ρ€ΠΎΠΊΠ°, выводящая ΠΊΡ‚ΠΎ сСйчас ΠΈΠ³Ρ€Π°Π΅Ρ‚

*/

private String getCurrentPlayer () {

return «Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ: «+ («Π§Π΅Π»ΠΎΠ²Π΅ΠΊ β„–» + (currentPlayerIdx + 1));

}

/**

* ОбновлСниС заголовка

*/

private void updateAppTitle () {

setTitle («Π”ΠΎΠΌΠΈΠ½ΠΎ. «+ getCurrentPlayer ());

}

/**

* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π°Π²Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚

*/

private void initComponents () {

Button buttonStart = new Button ();

Button buttonStop = new Button ();

setBackground (new Color (102, 102, 0));

setCursor (new Cursor (Cursor.HAND_CURSOR));

setLocationRelativeTo (null);

setResizable (false);

updateAppTitle ();

selected = false;

isHandling = false;

addWindowListener (new WindowAdapter () {

public void windowActivated (WindowEvent evt) {

formWindowActivated (evt);

}

public void windowClosing (WindowEvent evt) {

exitForm (evt);

}

public void windowOpened (WindowEvent evt) {

formWindowOpened (evt);

}

});

// ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ дСйствия ΠΈΠ³Ρ€ΠΎΠΊΠ°

addMouseListener (new MouseListener () {

public void mouseClicked (MouseEvent e) {

}

public void mousePressed (MouseEvent e) {

}

public synchronized void mouseReleased (MouseEvent e) {

if (isChoosingBone) {

int x = e. getX ();

int y = e. getY ();

selectedOnBoard = selectOnBoard (x, y);

doMove ();

} else if (!isHandling && gameStarted && !selected) {

isHandling = true;

int x = e. getX ();

int y = e. getY ();

selectedIdx = selectBone (x, y);

selected = (selectedIdx ≠ -1);

doMove ();

isHandling = false;

}

}

public void mouseEntered (MouseEvent e) {

}

public void mouseExited (MouseEvent e) {

}

});

addComponentListener (new ComponentAdapter () {

public void componentShown (ComponentEvent evt) {

formComponentShown (evt);

}

});

buttonStart.setLabel («ΠΠ°Ρ‡Π°Ρ‚ΡŒ»);

buttonStart.addActionListener (new ActionListener () {

public void actionPerformed (ActionEvent evt) {

gameStarted = true;

startButtonListener (evt);

}

});

buttonStop.setLabel («Π‘Ρ‚ΠΎΠΏ»);

buttonStop.addActionListener (new ActionListener () {

public void actionPerformed (ActionEvent evt) {

gameStarted = false;

stopButtonListener (evt);

}

});

GroupLayout layout = new GroupLayout (this);

this.setLayout (layout);

layout.setHorizontalGroup (layout.createParallelGroup (GroupLayout.Alignment.LEADING)

.addGroup (layout.createSequentialGroup ()

.addContainerGap ()

.addComponent (buttonStart, GroupLayout. PREFERRED_SIZE, GroupLayout. DEFAULT_SIZE, GroupLayout. PREFERRED_SIZE)

.addPreferredGap (LayoutStyle.ComponentPlacement.RELATED)

.addComponent (buttonStop, GroupLayout. PREFERRED_SIZE, 52, GroupLayout. PREFERRED_SIZE)

.addContainerGap (355, Short. MAX_VALUE))

); layout. setVerticalGroup (layout.createParallelGroup (GroupLayout.Alignment.LEADING)

.addGroup (layout.createSequentialGroup ().addContainerGap ().addGroup (layout.createParallelGroup (GroupLayout.Alignment.LEADING)

.addComponent (buttonStop, GroupLayout. PREFERRED_SIZE, 37, GroupLayout. PREFERRED_SIZE)

.addComponent (buttonStart, GroupLayout. PREFERRED_SIZE, 37, GroupLayout. PREFERRED_SIZE))

.addContainerGap (323, Short. MAX_VALUE))

);

pack ();

}

private int selectOnBoard (int x, int y) {

int[] bounds = (bonesOnTheDesk.get (0).getBounds ());

if (x > bounds[0] && x < bounds[1] && y > bounds[2] && y < bounds[3]) {

return 0;

}

bounds = (bonesOnTheDesk.get (bonesOnTheDesk.size () — 1).getBounds ());

if (x > bounds[0] && x < bounds[1] && y > bounds[2] && y < bounds[3]) {

return bonesOnTheDesk. size ();

}

return -1;

}

// ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²Π·ΡΡ‚ΡŒ ΠΊΠΎΡΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ

private int selectBone (int x, int y) {

for (int i = 0; i < playersBones[currentPlayerIdx]. size (); i++) {

Bone bone = playersBones[currentPlayerIdx]. get (i);

int[] bounds = (bone.getBounds ());

if (x > bounds[0] && x < bounds[1] && y > bounds[2] && y < bounds[3]) {

return i;

}

}

return -1;

}

private void exitForm (WindowEvent evt) {

System.exit (0);

}

private void formWindowOpened (WindowEvent evt) {

}

private void formWindowActivated (WindowEvent evt) {

}

private void formComponentShown (ComponentEvent evt) {

}

// инициализация костСй ΠΈ Ρ€Π°Π·Π΄Π°Ρ‡Π° ΠΈΡ… ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌ

private void initBones () {

ArrayList bonesPool = new ArrayList ();

bonesPool.clear ();

for (byte p = 0; p <= MAX_BONE_VALUE; p++) {

for (byte q = 0; q <= p; q++) {

bonesPool.add (new Bone (p, q));

}

}

for (int i = 0; i < PLAYERS_COUNT; i++) {

playersBones[i] = new ArrayList ();

}

bonesOnTheDesk = new ArrayList ();

for (int i = 0; i < MAX_BONES_COUNT; i++) {

for (int p = 0; p < PLAYERS_COUNT; p++) {

int k = (int) (Math.random () * bonesPool. size ());

playersBones[p]. add (bonesPool.get (k));

bonesPool.remove (k);

}

}

}

// Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΡ€ΠΈ стартС

private void startButtonListener (ActionEvent evt) {

graphics.clearRect (0, 0, getWidth (), getHeight ());

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡƒΠ» костСй ΠΈ Ρ€Π°Π·Π΄Π°Π΅ΠΌ ΠΈΡ… ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌΠΈ

initBones ();

// Π Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌ кости ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π½Π° ΡΠΊΡ€Π°Π½Π΅

for (int p = 0; p < PLAYERS_COUNT; p++) {

for (int i = 0; i < MAX_BONES_COUNT; i++) {

Bone bone = playersBones[p]. get (i);

int x = 0, y = 0;

int dx = 0, dy = 0;

switch (p) {

case 0:

x = this. getWidth () / 2 — Bone. width * 7;

y = this. getHeight () — Bone. width;

dx = (Bone.height + 10);

dy = 0;

bone.rotate ((byte) 1, (byte) 0, graphics, backgroundColor);

break;

case 1:

x = Bone. width;

y = 120;

dx = 0;

dy = Bone. height + 10;

bone.rotate ((byte) 0, (byte) 1, graphics, backgroundColor);

break;

case 2:

x = this. getWidth () / 2 — Bone. width * 7;

y = 30 + Bone. width;

dx = (Bone.height + 10);

dy = 0;

bone.rotate ((byte) -1, (byte) 0, graphics, backgroundColor);

break;

case 3:

x = this. getWidth () — Bone. width;

y = 120;

dx = 0;

dy = Bone. height + 10;

bone.rotate ((byte) 0, (byte) -1, graphics, backgroundColor);

break;

}

bone.moveTo (x + i * dx, y + i * dy, graphics, backgroundColor);

}

}

int idxOfFirstPlayingPlayer = -1;

for (int n = 1; n <= MAX_BONE_VALUE; n++) {

for (int p = 0; p < PLAYERS_COUNT; p++) {

for (int i = 0; i < playersBones[p]. size (); i++) {

Bone bone = playersBones[p]. get (i);

if (bone.points (0) == n && bone. points (1) == n) {

currentPlayerIdx = p;

idxOfFirstPlayingPlayer = i;

}

}

}

if (currentPlayerIdx >= 0) break;

}

int pause = 2000;

long t = System. currentTimeMillis ();

do {

} while (System.currentTimeMillis () — t < pause);

Bone bone = playersBones[currentPlayerIdx]. get (idxOfFirstPlayingPlayer);

bone.rotate (1, 0, graphics, backgroundColor);

bone.moveSliding (getWidth () / 2, getHeight () / 2, 500, graphics, backgroundColor);

bonesOnTheDesk.add (bone);

playersBones[currentPlayerIdx]. remove (idxOfFirstPlayingPlayer);

currentPlayerIdx = (currentPlayerIdx + 1) % PLAYERS_COUNT;

updateAppTitle ();

placeJ[0] = bone. getX ();

placeJ[1] = bone. getX ();

placeK[0] = bone. getY ();

placeK[1] = bone. getY ();

rotationJ[0] = -1;

rotationJ[1] = +1;

rotationK[0] = 0;

rotationK[1] = 0;

endPoints[0] = bone. points (0);

endPoints[1] = bone. points (1);

isChoosingBone = false;

doMove ();

}

private synchronized void doMove () {

int x2, y2;

Bone bone = null;

int side = -1;

boolean isShouldReturn;

if (isChoosingBone) {

isChoosingBone = false;

isShouldReturn = false;

bone = playersBones[currentPlayerIdx]. get (selectedIdx);

highlightBones (bone, false);

if (selectedOnBoard == -1) {

return;

} else {

bonesOnTheDesk.add (selectedOnBoard, bone);

playersBones[currentPlayerIdx]. remove (selectedIdx);

side = (selectedOnBoard == 0)? 0: 1;

selected = false;

}

} else if (!hasMoves ()) {

passesCount++;

currentPlayerIdx = (currentPlayerIdx + 1) % PLAYERS_COUNT;

getToolkit ().beep ();

updateAppTitle ();

doMove ();

return;

} else if (!selected) {

isShouldReturn = true;

} else {

bone = playersBones[currentPlayerIdx]. get (selectedIdx);

isShouldReturn = true;

if ((endPoints[0] ≠ endPoints[1]) && (bone.points (0) == endPoints[0] && bone. points (1) == endPoints[1]) || (bone.points (1) == endPoints[0] && bone. points (0) == endPoints[1])) {

highlightBones (bone, true);

isChoosingBone = true;

selected = false;

return;

}

for (side = 0; side <= 1; side++) {

if (bone.points (0) == endPoints[side] ||

bone.points (1) == endPoints[side]) {

if (side == 0) {

bonesOnTheDesk.add (0, bone);

} else {

bonesOnTheDesk.add (bonesOnTheDesk.size (), bone);

}

playersBones[currentPlayerIdx]. remove (selectedIdx);

isShouldReturn = false;

break;

}

}

selected = false;

}

if (isShouldReturn) {

return;

}

boolean stop = false;

if (bone.points (0) == endPoints[side]) {

bone.rotate (+rotationJ[side], +rotationK[side], graphics, backgroundColor);

endPoints[side] = bone. points (1);

} else {

bone.rotate (-rotationJ[side], -rotationK[side], graphics, backgroundColor);

endPoints[side] = bone. points (0);

}

placeJ[side] += rotationJ[side] * Bone. height;

placeK[side] += rotationK[side] * Bone. height;

x2 = placeJ[side];

y2 = placeK[side];

if (rotationJ[side] == -1 && placeJ[side] < Bone. height * 3) {

rotationJ[side] = 0;

rotationK[side] = -1;

placeJ[side] -= Bone. width / 2;

placeK[side] += Bone. width / 2;

}

if (rotationK[side] == -1 && placeK[side] < Bone. height * 3) {

rotationJ[side] = +1;

rotationK[side] = 0;

placeJ[side] -= Bone. width / 2;

placeK[side] -= Bone. width / 2;

}

if (rotationJ[side] == +1 && placeJ[side] > getWidth () — Bone. height * 3) {

rotationJ[side] = 0;

rotationK[side] = +1;

placeJ[side] += Bone. width / 2;

placeK[side] -= Bone. width / 2;

}

if (rotationK[side] == +1 && placeK[side] > getHeight () / 2 * (side + 1) — Bone. height * 2) {

rotationJ[side] = -1;

rotationK[side] = 0;

placeJ[side] += Bone. width / 2;

placeK[side] += Bone. width / 2;

}

bone.moveSliding (x2, y2, 500, graphics, backgroundColor);

for (Bone aBonesOnTheDesk: bonesOnTheDesk) {

aBonesOnTheDesk.show (graphics);

}

for (int p = 0; p < PLAYERS_COUNT; p++) {

for (int i = 0; i < playersBones[p]. size (); i++) {

playersBones[p]. get (i).show (graphics);

}

}

passesCount = 0;

if (playersBones[currentPlayerIdx]. size () == 0) {

stop = true;

}

if (passesCount == PLAYERS_COUNT) {

JOptionPane.showMessageDialog (this, «Π Ρ‹Π±Π°! ПобСдил ΠΈΠ³Ρ€ΠΎΠΊ :» + getWinnerName ());

return;

} else if (stop) {

JOptionPane.showMessageDialog (this, «ΠŸΠΎΠ±Π΅Π΄ΠΈΠ» ΠΈΠ³Ρ€ΠΎΠΊ: «+ («Π§Π΅Π»ΠΎΠ²Π΅ΠΊ β„–» + (currentPlayerIdx + 1)));

return;

}

currentPlayerIdx = (currentPlayerIdx + 1) % PLAYERS_COUNT;

updateAppTitle ();

doMove ();

}

private void highlightBones (Bone bone, boolean isHighlight) {

Bone begin = bonesOnTheDesk. get (0);

Bone end = bonesOnTheDesk. get (bonesOnTheDesk.size () — 1);

if (isHighlight) {

bone.setColorMarked ().show (graphics);

begin.setColorMarked ().show (graphics);

end.setColorMarked ().show (graphics);

} else {

bone.setColorUsual ().show (graphics);

begin.setColorUsual ().show (graphics);

end.setColorUsual ().show (graphics);

}

}

private boolean hasMoves () {

for (int i = 0; i < playersBones[currentPlayerIdx]. size (); i++) {

Bone bone = playersBones[currentPlayerIdx]. get (i);

for (int side = 0; side <= 1; side++) {

if (bone.points (0) == endPoints[side] || bone. points (1) == endPoints[side]) {

return true;

}

}

}

return false;

}

private String getWinnerName () {

int winnerIdx = 0;

int min = 239 239; // это число явно большС суммы всСх Ρ†ΠΈΡ„Ρ€ Π½Π° ΠΊΠΎΡΡ‚ΡΡˆΠΊΠ°Ρ…

for (int p = 0; p < PLAYERS_COUNT; p++) {

int curMin = 0;

for (Bone bone: playersBones[p]) {

curMin += bone. points (0) + bone. points (1);

}

if (curMin < min) {

min = curMin;

winnerIdx = p;

}

}

return «Π§Π΅Π»ΠΎΠ²Π΅ΠΊ β„–» + (winnerIdx + 1);

}

private void stopButtonListener (ActionEvent evt) {

// do nothing

}

public static void main (String args[]) {

EventQueue.invokeLater (new Runnable () {

public void run () {

MainFrame frame = new MainFrame ();

frame.setSize (800, 600);

frame.setLocation (100, 50);//?!

frame.setVisible (true);

}

});

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 2. ВСстовый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Для запуска ΠΈΠ³Ρ€Ρ‹ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ «ΠΠ°Ρ‡Π°Ρ‚ΡŒ»:

Π”Π°Π»Π΅Π΅ рСализуСтся ΠΈΠ³Ρ€Π°. Π’ ΠΈΠ³Ρ€Π΅ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ 4 ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… управляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, ΠΏΡ€ΠΈ этом Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΎΠΊΠ½Π° указываСтся Ρ‚ΠΎΡ‚ ΠΈΠ· Π½ΠΈΡ…, ΠΊΡ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ…ΠΎΠ΄. ΠšΠΎΡΡ‚ΠΈ постСпСнно Π²Ρ‹ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ†Π΅ΠΏΡŒ:

Π˜Π³Ρ€Π° заканчиваСтся, ΠΊΠΎΠ³Π΄Π° Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π½Π΅ ΠΎΡΡ‚аСтся Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ кости, ΠΈΠ»ΠΈ Π½ΠΈ Ρƒ ΠΊΠΎΠ³ΠΎ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π½Π΅Ρ‚ подходящСй:

Π’ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Сля Π±Ρ‹Π»ΠΎ наимСньшСС количСство ΠΎΡ‡ΠΊΠΎΠ², ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому ΠΎΠ½ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΌ. Битуация «Ρ€Ρ‹Π±Π°» прСдусмотрСна.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ