javafx ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ fxml ΠΊ ΠΊΠΎΠ΄Ρ
Javafx ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ fxml ΠΊ ΠΊΠΎΠ΄Ρ
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π² ΠΏΠ°ΠΏΠΊΠ΅, Π³Π΄Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠ°ΠΉΠ» Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (Π΄ΠΎΠΏΡΡΡΠΈΠΌ, ΡΡΠΎ ΡΠ°ΠΉΠ» Main.java), Π½ΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π·ΠΎΠ²Π΅ΠΌ Main.fxml ΠΈ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅:
ΠΡΠΎΡ ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ html- ΠΈΠ»ΠΈ xml-ΡΠ°ΠΉΠ», Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ Π² ΡΠ³Π»ΠΎΠ²ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ.
Π€Π°ΠΉΠ» Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ xml, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΊΠ°Π·Π²Π°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π²Π΅ΡΡΠΈΡ xml ΠΈ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΡ.
ΠΠ°ΡΠ΅ΠΌ ΠΈΠ΄ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΈ ΠΏΠ°ΠΊΠ΅ΡΡ. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ Π² ΡΠ°ΠΉΠ»Π°Ρ java ΠΏΠ΅ΡΠ΅Π΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠΎΠ² Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΡΠΈΠΏΠ°:
Π’Π°ΠΊ ΠΈ Π² ΡΠ°ΠΉΠ»Π΅ fxml ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΈΠ»ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ:
Π ΠΏΠ΅ΡΠ²ΠΎΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ ΠΈΠΌΠΏΠΎΡΡΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° java.lang, Π° Π²ΡΠΎΡΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΊΠ»Π°ΡΡ javafx.scene.control.Button. ΠΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠΌ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ ΠΊΠ»Π°ΡΡΡ, ΡΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² FXML.
ΠΠΎΡΠ»Π΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠΌΠΏΠΎΡΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ Π½Π°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΎΠ΄Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ°. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ»Π°ΡΡ Button, ΡΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Button. Π’ΠΎ Π΅ΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π°Π·Π²Π°ΠΈΡΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² Π΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Button.
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Button ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Button.
Π’Π΅ΠΏΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠ»Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ» FXML:
ΠΠ΅ΡΠΎΠ΄ FXMLLoader.load() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° Parent, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Scene, ΠΈ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈΠ· fxml.
Π ΠΈΡΠΎΠ³Π΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΎΠΊΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ. ΠΡΠ΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ FXML ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° fxml Π±Π΅Π· ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΡ ΡΡΠ»ΠΎΠΆΠ½ΠΈΠΌ ΡΠ°ΠΉΠ» Main.fxml :
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Group. ΠΡΠΈ ΡΡΠΎΠΌ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ. ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
JavaFX: ΠΊΠ»Π°ΡΡ Controller ΠΈ fx:id Π² FXML
ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ, Π½Π΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΡΡΠ°ΡΠ΅ΠΉ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ ΠΏΠΎΡΠ²ΡΡΠ°ΡΡ ΠΈ Π΄Π²ΡΡ ΡΠ»ΠΎΠ² ΡΠ°ΠΌΠΎΠΌΡ ΠΆΠΈΠ²ΠΎΡΡΠ΅ΠΏΠ΅ΡΡΡΠ΅ΠΌΡ Π²ΠΎΠΏΡΠΎΡΡ ΠΏΡΠΈ Π½Π°ΡΠ°Π»Π΅ ΡΠ°Π±ΠΎΡΡ Ρ JavaFX, Π½ΠΎ ΠΈ ΠΏΠΎΡΠ²ΡΡΠΈΠ², Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½Π΅ ΡΠ°ΡΠΊΡΡΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ. Π Π²ΠΎΠΏΡΠΎΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ: ΠΊΠ°ΠΊ Π½Π°Π»Π°Π΄ΠΈΡΡ ΡΠ²ΡΠ·Ρ Π²Π°ΡΠΈΡ node ΠΏΠΎ ΠΈΡ fx:id ΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°. ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ Π² ΡΠ°Π·Π½ΡΡ ΡΠ°ΡΡΡΡ ΠΊΠΎΠ΄Π°, ΡΡΠΎΠ±Ρ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° Π²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ? ΠΠΎΡ Π½Π° ΡΡΠΎ, Ρ ΠΈ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡ ΠΎΡΠ²Π΅ΡΠΈΡΡ ΠΏΠΎΠ΄ ΠΊΠ°ΡΠΎΠΌ
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ fx:id ΠΈ Ρ ΡΠ΅ΠΌ Π΅Π³ΠΎ Π΅Π΄ΡΡ
ΠΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅, Π΄Π»Ρ Π°Π²ΡΠΎΡΠΎΠ² ΡΡΠ°ΡΠ΅ΠΉ ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΎΡΠΎΠ² Π½Π° StackOverFlow Π½Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΏΠΎΠΏΡΠΎΡΡΡ Π½Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎ Π΄Π»Ρ ΡΠΈΡΠ°ΡΠ΅Π»Ρ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ²ΡΠ·Ρ fx:id ΡΡΡΠ»ΠΎΠΊ Ρ Π²Π°ΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ Π½Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ. Π Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ, Π²ΠΎΠΎΠ±ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΡ ΠΎΠΆΠΈ Π½Π° ΠΌΠ°Π³ΠΈΡ, ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΠΏΠΎΠΌΡΠ½Ρ Π½ΠΈΠΆΠ΅.
ΠΠΎΠΎΠ±ΡΠ΅, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡΠ°ΡΡΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½Ρ (ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ), ΡΠ°ΠΊ ΠΆΠ΅, Π΅ΡΡΡ ΠΎΡΠ²Π΅ΡΡ ΠΏΠΎΡΡΠΈ Π½Π° Π²ΡΠ΅ Π½Π° StackOverFlow. ΠΠΎ, ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½ΠΈΠ³Π΄Π΅ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΠΎ Π½Π΅ ΡΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ fx:id, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π² FXML ΡΠ°ΠΉΠ»Π΅. ΠΠΈΡΡ ΠΊΡΠ°ΡΠΊΠΈΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΠΏΡΡΠ°Π½ΠΈΡΠ΅ Π² Π³ΠΎΠ»ΠΎΠ²Π΅. ΠΠ±ΡΡΠ½ΠΎ ΠΏΠΈΡΡΡ «Π·Π°Π΄Π°ΠΉΡΠ΅ Π²Π°ΡΠ΅ΠΉ node Π½ΡΠΆΠ½ΡΠΉ Π²Π°ΠΌ fx:id ΠΈ Π±ΡΠ΄Π΅ΠΌ Π²Π°ΠΌ ΡΡΠ°ΡΡΡΠ΅».
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΡΠ°ΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ. ΠΡΠ΄Π΅Ρ NullPointerException. ΠΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠ΄Π΅Ρ ΠΈΠ· Π½Π΅ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΡΠΊΠ°ΠΆΠ΅ΠΌ ΡΠ°ΠΊ, ΡΡΠΈΡ id. Π Ρ Ρ ΠΎΡΡ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ, ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ exception, Π° Π³Π»Π°Π²Π½ΠΎΠ΅, ΠΊΠ°ΠΊ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ²ΡΠ·Π°ΡΡ Π²Π°Ρ FXML Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ-ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠΌ ΠΈ java-ΠΊΠΎΠ΄ΠΎΠΌ. ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π»ΡΠ΄ΡΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΠ΅Ρ ΠΌΡΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΡΠ΅Π» Ρ Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΠΎΡΠ²Π΅ΡΠ° Π½Π° Π΄Π°Π½Π½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ.
Π― Π±Ρ Π½Π°Π²Π΅ΡΠ½ΠΎ ΠΈ ΠΏΡΠΈΡΠ΅Π» ΠΊ ΠΎΡΠ²Π΅ΡΡ ΡΠ°ΠΌ, ΡΠ°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ, Π½ΠΎ ΡΠΏΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΠ°ΡΡ Π΄Π½ΠΈ ΠΏΠΎΠΈΡΠΊΠ°, Ρ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° ΡΡΠ°ΡΡΡ. Π Π½Π΅ΠΉ ΡΠ°ΡΡΠΊΠ°Π·Π°Π½ΠΎ ΠΏΡΠΎ MVC ΠΌΠΎΠ΄Π΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΡ ΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Π½Π° JavaFX. ΠΠ΅ ΡΡΠ°Π½Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ Π² ΡΡΠ°ΡΡΠ΅, ΡΠ°ΠΌ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΡΠ»ΠΈ Π²Ρ ΠΎ Π½Π΅ΠΉ Π½Π΅ ΡΠ»ΡΡΠ°Π»ΠΈ, ΡΠΎ ΠΊ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°Ρ Ρ javaFX Π²ΠΎΠΎΠ±ΡΠ΅ Π±Π΅Π· FXML, Π½Π° ΡΠΈΡΡΠΎΠΌ java ΠΊΠΎΠ΄Π΅, Π½ΠΎ Π½Π΅ ΡΡΠΎΠΈΡ. Π’Π°ΠΊ ΠΆΠ΅, ΡΠ°ΠΌ Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΎΠΆΠΈΡΡ fx:id, Π½ΠΎ Ρ Π²ΡΠ΅ ΠΆΠ΅ Ρ ΠΎΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΡ ΡΡΠ°ΡΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΡΠΌΠΈ ΠΈ Π·Π½Π°Π½ΠΈΡΠΌΠΈ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅.
ΠΠΎΠ΄Π΅Π»Ρ ΡΡΠ°, ΠΊΡΡΠ°ΡΠΈ, Π½Π΅ ΡΠ°ΠΊ ΠΎΡΠ΅Π²ΠΈΠ΄Π½Π°, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠ°ΡΡΠΈ Π½Π° Oracle. ΠΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Ρ Π½Π΅ Π½Π°ΡΠ΅Π» Ρ Oracle, ΠΊΠ°ΠΊ ΠΌΠ½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ fx:id. ΠΠ°ΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π», ΡΡΠΎ ΠΈ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ, ΠΊΠ°ΠΊ Ρ Π½ΠΈΠΌΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
ΠΡΠ°ΠΊ, Ρ ΠΏΡΠ΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅ΠΌ ΠΏΠΎΡΠ° Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡ, ΠΊ Π΄Π΅Π»Ρ.
Π§ΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π½Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Π² ΡΡΠ°ΡΡΡΡ ? ΠΡΠΈΠΌΠ΅ΡΡ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ°Ρ , ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ Π² FXML ΠΎΡΠΎΡΠΌΠΈΡΡ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊ Π½Π΅ΠΌΡ ΠΊΠ»Π°ΡΡ-ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ Application, Π² Π½Π΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ start() (ΠΈΠ»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅ Main, ΡΠ°Π·Π½ΡΠ΅ Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΡ) ΠΈ ΡΠ°ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²Π°ΡΠΈΠΌΠΈ fx:id. Π ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ, ΡΡΠ΄Π½Π΅Π½ΡΠΊΠΎ, Π²ΡΠ΅ ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ, ΡΡΠΎ Π΄Π°ΠΆΠ΅ Ρ ΠΎΡΠ΅ΡΡΡ ΡΠΏΠ»ΡΡΠ°ΡΡ.
ΠΠΎΡ Π΄Π°ΠΆΠ΅ Π±Π°Π½Π°Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ «hello world»:
ΠΡΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, Π² FXML ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Pane, Π² Π½Π΅ΠΉ ΠΎΠ΄Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ° Button, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ fx:id=»fxButton», ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° Π½Π΅Π΅, Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π² ΠΊΠ»Π°ΡΡΠ΅-ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅ onAction=»#click». Π ΠΌΠ΅ΡΠΎΠ΄Π΅ click Π΅ΡΡΡ Π²ΡΠ²ΠΎΠ΄ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΠΈ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ° ΡΠ°ΠΌΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠ΅.
ΠΡΠ»ΠΈ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΈ ΡΠΊΠ½ΡΡΡ Π² ΠΊΠ½ΠΎΠΏΠΊΡ, ΡΠΎ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Ρ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ Π΅Π΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅. ΠΠΈΡ ΠΎ? Π Π²ΠΎΡ ΠΈ Π½Π΅Ρ. ΠΡΠΎ Π½Π΅ Π²Π½ΠΎΡΠΈΡ ΡΡΠ½ΠΎΡΡΠΈ, ΠΊΠ°ΠΊ Ρ ΡΡΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ. Π ΡΠ°ΠΊΠΈΠΌΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΏΠ΅ΡΡΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ. Π Π΅ΡΠ»ΠΈ Π½Π΅ Π΄Π΅Π»Π°ΡΡ MVC ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΈΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π½Π΅ ΡΠ°Π·Π΄Π΅Π»ΡΡΡ ΠΈ Π²Π»Π°ΡΡΠ²ΠΎΠ²Π°ΡΡ, ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΠΊΠ°ΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠΎΠ΄ΡΠΊΠΎΠ»ΡΠ·Π½Π΅ΡΡΡΡ, Π½Ρ ΠΈ ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΡΡ Π²ΠΎ Π²ΡΠ΅Ρ Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΈΡ ΡΠΈΠ»ΡΠΌΠ°Ρ , «ΡΠΏΠ°Π΄Π΅ΡΡ ΠΈ ΡΠ»ΠΎΠΌΠ°Π΅ΡΡ Π±Π΅Π΄ΡΠΎ». ΠΡΠΈΡΠ΅ΠΌ, Π±Π΅Π΄ΡΠ΅Π½Π½Π°Ρ ΠΊΠΎΡΡΡ β ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΊΡΠ΅ΠΏΠΊΠΈΡ β¦
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ, Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΊΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ ΡΠ°Π³ΠΎΠΌ, Π±ΡΠ»ΠΎ Π±Ρ Π²Π·ΡΡΡ Π² ΡΡΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ΄Π΅ Π²ΡΡΠ΅, ΡΠ±ΡΠ°ΡΡ ΠΈΠ· Π½Π΅Π³ΠΎ ΠΌΠ΅ΡΠΎΠ΄ click ΠΈ ΠΏΠΎΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΈΠ· ΠΊΠΎΠ΄Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π° start(), ΡΡΠΎΠ±Ρ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Ρ ΠΎΠ΄ΠΈΡΡ, Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π½Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΊΠ»ΠΈΠΊΠ° ΠΌΡΡΠΊΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ fxButton (ΠΏΠ°Π½Π΅Π»Ρ/ΠΈΠ½ΡΡ ΡΠ°ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ fx:id):
ΠΠ°Ρ ΠΎΠ±ΠΌΠ°ΡΠ΅ΡΠΈΡ Π²Π°ΡΠ° IDE Π΅ΡΠ΅ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at sample.Main.start(Main.java:25)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
β¦ 1 more
Exception running application sample.Main
Process finished with exit code 1
Π ΠΏΠ΅ΡΠ²ΡΠΉ ΠΌΠΈΠ³, Π·Π°Ρ
ΠΎΡΠ΅ΡΡΡ ΠΌΠ°ΡΠ΅ΡΠΈΡΡΡΡ Π² ΠΎΡΠ²Π΅Ρ, Π²Π΅Π΄Ρ Π½Π΅ ΡΡΠ½ΠΎ, ΠΏΠΎΡΠ΅ΠΌΡ Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ. ΠΠ΅Π΄Ρ ΡΡΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ, ΠΎΠ½ Π·Π½Π°Π΅Ρ ΠΏΡΠΎ FXML ΡΠ°ΠΉΠ», Π² Π½Π΅Π³ΠΎ Ρ ΡΡΠΏΠ΅Ρ
ΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ, Π²Π΅Π΄Ρ Π² ΠΊΠΎΠ΄Π΅ Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ click ΠΌΡ ΡΠ°ΠΊ ΠΈ Π΄Π΅Π»Π°Π»ΠΈ, ΠΎΠ±ΡΠ°ΡΠ°Π»ΠΈΡΡ ΠΏΠΎ fx:id.
ΠΠΎ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΌΠ΅ΡΠΎΠ΄Π°Ρ
, Π² ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ΠΈ ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Ρ Π² FXML. Π ΠΏΡΠΈ ΠΏΡΡΠΌΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΈΠ· ΠΊΠΎΠ΄Π° java Π² ΡΠ°ΠΉΠ» FXML, Π° Π½Π΅ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½Π°Ρ Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Button fxButton, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΠ»ΠΈΡΡ β Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°. ΠΠΎΡ ΠΊΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ, Π½Π΅Π·Π°Π΄Π°ΡΠ°. Π Π²ΠΎΠ»ΠΊΠΈ Π²ΡΠΎΠ΄Π΅ ΡΡΡΡ, Π΄Π° ΠΈ ΠΎΠ²ΡΡ ΡΠ΅Π»Ρ, Π½ΠΎ Π²ΠΎΡ ΠΏΠ°ΡΡΡΡ
ΡΠ»Π΅Π³ΠΊΠ° Π»ΡΠΊΠ°Π²ΠΈΡ.
ΠΠ°ΡΠ° IDE, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, IDEA, Π²ΠΏΠΎΠ»Π½Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΡΠ΅, ΠΌΠΎΠ΄Π΅Π»Ρ Π² Π½Π΅ΠΌ Π²Π΅ΡΠ½Π°Ρ(Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ FXML ΠΈ ΠΊΠ»Π°ΡΡΡ Controller, Main ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² Π½Π΅ΠΌ). ΠΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π±ΠΎΡΡ. Π― Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΈΡΠ°Π» ΠΊΠΎΠ΄Π°, Π΄Π»Ρ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡΠΈ, Π½ΠΎ ΡΠ΄Π΅Π»Π°Π» ΡΡΠΎ Π² Main ΠΊΠ»Π°ΡΡΠ΅, Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, Π΄Π»Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΠΈ ΠΌΠ΅ΡΡΠ°.
ΠΡΠ°ΠΊ, Π²ΡΡ ΠΎΠ΄ΠΈΡ ΡΡΠΎ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π²Π°ΡΠΈΠΌΠΈ node Π² Π² FXML ΡΠ°ΠΉΠ»Π΅, Π²Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ. ΠΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠ½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ fx:id.
ΠΠΎ, ΡΡΠΎΠΈΡ Π·Π°Π΄ΡΠΌΠ°ΡΡΡΡ ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠ° Π²ΡΡΠ΅ Π² Π΄ΡΡΠ³ΠΈΡ ΡΠ°ΡΡΡΡ ΠΊΠΎΠ΄Π° (ΡΠΎΡΠ½Π΅Π΅ Π²ΡΡΠ°Π·ΠΈΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ fx:id ΡΡΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²), Π΄Π°ΠΆΠ΅ Π² ΡΡΠΎΠΌ ΠΆΠ΅ ΠΊΠ»Π°ΡΡΠ΅ (Π° ΡΡΠΎ β ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ), Π²Π°Ρ ΠΆΠ΄Π΅Ρ NullPointerException ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, WHY? Π Π²Π΄ΡΡΠ³ Ρ Ρ ΠΎΡΡ Π² ΠΊΠΎΠ΄Π΅ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΊΠ°ΠΊΡΡ-Π»ΠΈΠ±ΠΎ ΠΏΠ°Π½Π΅Π»Ρ, ΡΠ΄Π΅Π»Π°Π² Π΅ΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ fx:id, ΠΌΠ΅Π½ΡΡΡ ΡΠ΅ΠΊΡΡ ΠΈΠ»ΠΈ Π²Π½Π΅ΡΠ½ΠΈΠΉ Π²ΠΈΠ΄ ΡΠΎΡΠΌ, ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΡΠΎΡΠΈΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, Π΄Π΅Π»Π°Ρ ΡΡΠΎ ΠΈΠ· ΠΊΠΎΠ΄Π°, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π»ΠΎΠ³ΠΈΠΊΠ΅? ΠΠ°ΠΊΠΎΠ΅ Π²Π΅ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅?
ΠΡΠΎ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΈΡΡΠ²Π°Ρ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡ Π²ΠΎΠΏΡΠΎΡΡ, ΡΡΠΎ Ρ ΡΡΠ΅Π» Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½ Π·Π° ΠΏΠΈΠ²ΠΎΠΌ.
ΠΠ΅ΡΠ½ΡΠ²ΡΠΈΡΡ ΠΈ ΠΏΡΠΎΠΊΠΎΠ²ΡΡΡΠ² Π΄ΡΡΡ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ ΠΈ Π² Π³ΠΎΠ»ΠΎΠ²Π΅, ΠΏΠ΅ΡΠ΅ΠΏΡΠΎΠ±ΠΎΠ²Π°Π² ΡΠ°Π·Π½ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ, Ρ Π΄ΠΎΠΊΠΎΠΏΠ°Π»ΡΡ Π΄ΠΎ ΠΈΡΡΠΈΠ½Ρ. ΠΠ΅ΡΡΠ°ΠΌΠΈ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅, Π²ΠΈΠ΄Π΅Π» ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ. Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΡΠΎ ΠΈ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ, Π½ΠΎ Π½ΠΈΠ³Π΄Π΅ ΠΎΠΏΡΡΡ ΠΆΠ΅, Π½Π΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ². ΠΠΎ ΡΠ°ΠΊΠΎΠΌΡ ΡΠ»ΡΡΠ°Ρ, ΡΠ΅ΠΉΡΠ°Ρ ΠΏΡΠΈΠΌΠ΅ΡΡ Ρ ΡΠ°Π·ΡΡΡΠ½Π΅Π½ΠΈΡΠΌΠΈ Π±ΡΠ΄ΡΡ Ρ ΠΌΠ΅Π½Ρ. ΠΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π° javaFX, ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΊΠΎΠ΄.
FXML. ΠΠ½Π΅ΡΠ½ΠΈΠΉ Π²ΠΈΠ΄. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π² Π½Π΅ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ
Main. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π·Π°Π΄Π°ΡΠ°, Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΡΠ΅Π½Ρ ΠΈΠ· FXML
Controller. ΠΠ΄Π°ΠΏΡΠ΅Ρ FXML ΠΈ java ΠΊΠΎΠ΄Π°.
View. ΠΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠΎ, ΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
Π ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅ ΠΈ View Ρ ΠΏΠΎΠΊΠ°Π·Π°Π», ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ Ρ fx:id.
ΠΡΡΠΌΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ Π² FXML Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ id ΠΈ ΠΈΠΆΠ΅ Ρ Π½ΠΈΠΌΠΈ node ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π² ΠΊΠΎΠ΄Π΅, Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΡΡΠΈΡ node ΠΏΠΎ ΠΈΡ fx:id.
Π Π°Π·Π±Π΅ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠ΄Π°, ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅. ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π²ΠΎΡ ΡΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΎΠΊΠ½ΠΎ:
Π FXML ΡΠ°ΠΉΠ»Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΡΠ΅ΠΊΡΡ labelFx, Π½ΠΎ Π² initialize() ΠΎΠ½ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅, ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅.
ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ:
ΠΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π²ΡΠ²ΠΎΠ΄ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ «Hello World», Ρ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΡ Π½Π° «Hey!», ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ Π² ΠΌΠ΅ΡΠΎΠ΄ labelLocalInitialize(), Π² Π½Π΅ΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π°Π·Π½Π°ΡΠ°Π΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ labelFx. Π‘Π»Π΅Π΄ΠΎΠΌ, labelFx Π½Π°Π·Π½Π°ΡΠ°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ΅ΠΊΡΡ.
Π Π΅Π·ΡΠΌΠΈΡΡΡ:
ΠΠ΄Π΅-ΡΠΎ Π²ΡΡΠ΅ Ρ Π³ΠΎΠ²ΠΎΡΠΈΠ», ΡΡΠΎ Π΅ΡΡΡ ΠΌΠ°Π³ΠΈΡ Π² javaFX. ΠΠ½Π° Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅ View. ΠΡΠΎΠ΄Π΅, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ Π±Ρ Π±ΡΠ»ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡΡ, Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ id, Π½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ΅β¦ ΠΠΎΡΠ΅ΠΌΡ ΡΠ°ΠΊ ΡΠ΄Π΅Π»Π°Π½ΠΎ, Ρ Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π½Π΅ Π²Π΄Π°Π²Π°Π»ΡΡ, Ρ ΠΎΡΡ ΠΈ Π»ΡΠ±ΠΎΠΏΡΡΠ½ΠΎ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΠ°ΠΊ. ΠΡΠ»ΠΈ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ Π·Π½Π°ΡΡΠΈΠ΅ Π»ΡΠ΄ΠΈ ΠΏΡΠΈΠΎΡΠΊΡΠΎΡΡ Π·Π°Π²Π΅ΡΡ ΡΠ°ΠΉΠ½Ρ, Π±ΡΠ΄Ρ Π²Π΅ΡΡΠΌΠ° Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½.
Release: JavaFX 2.2.40
Last Updated: September 2013
[+] Show/Hide Table of Contents
About This Tutorial
1 Hello World, JavaFX Style
2 Creating a Form in JavaFX
3 Fancy Forms with JavaFX CSS
4 Using FXML to Create a User Interface
5 Animation and Visual Effects in JavaFX
6 Deploying Your First JavaFX Application
Application Files
View Source Code
Download Source Code
Profiles
Gail Chappell
Technical Writer, Oracle
Gail is part of the JavaFX documentation team and enjoys working on cutting-edge, innovative documentation.
Nancy Hildebrandt
Technical Writer, Oracle
Nancy is a technical writer in the JavaFX group. She has a background in content management systems, enterprise server-client software, and XML. She lives on 480 acres in the middle of nowhere with horses, a donkey, dogs, cats, and chickens, and stays connected by satellite.
We Welcome Your Comments
If you have questions about JavaFX, please go to the forum.
Getting Started with JavaFX
4 Using FXML to Create a User Interface
This tutorial shows the benefits of using JavaFX FXML, which is an XML-based language that provides the structure for building a user interface separate from the application logic of your code.
If you started this document from the beginning, then you have seen how to create a login application using just JavaFX. Here, you use FXML to create the same login user interface, separating the application design from the application logic, thereby making the code easier to maintain. The login user interface you build in this tutorial is shown in Figure 4-1.
Figure 4-1 Login User Interface
Description of «Figure 4-1 Login User Interface»
This tutorial uses NetBeans IDE. Ensure that the version of NetBeans IDE that you are using supports JavaFX 2.2. See the System Requirements for details.
Set Up the Project
Your first task is to set up a JavaFX FXML project in NetBeans IDE:
NetBeans IDE opens an FXML project that includes the code for a basic Hello World application. The application includes three files:
FXMLExample.java. This file takes care of the standard Java code required for an FXML application.
Sample.fxml. This is the FXML source file in which you define the user interface.
SampleController.java. This is the controller file for handling the mouse and keyboard input.
Rename SampleController.java to FXMLExampleController.java so that the name is more meaningful for this application.
Rename Sample.fxml to fxml_example.fxml.
Load the FXML Source File
The first file you edit is the FXMLExample.java file. This file includes the code for setting up the application main class and for defining the stage and scene. More specific to FXML, the file uses the FXMLLoader class, which is responsible for loading the FXML source file and returning the resulting object graph.
Make the changes shown in bold in Example 4-1.
Example 4-1 FXMLExample.java
A good practice is to set the height and width of the scene when you create it, in this case 300 by 275; otherwise the scene defaults to the minimum size needed to display its contents.
Modify the Import Statements
Next, edit the fxml_example.fxml file. This file specifies the user interface that is displayed when the application starts. The first task is to modify the import statements so your code looks like Example 4-2.
Example 4-2 XML Declaration and Import Statements
As in Java, class names can be fully qualified (including the package name), or they can be imported using the import statement, as shown in Example 4-2. If you prefer, you can use specific import statements that refer to classes.
Create a GridPane Layout
The Hello World application generated by NetBeans uses an AnchorPane layout. For the login form, you will use a GridPane layout because it enables you to create a flexible grid of rows and columns in which to lay out controls.
Remove the AnchorPane layout and its children and replace it with the GridPane layout in Example 4-3.
Example 4-3 GridPane Layout
In this application, the GridPane layout is the root element of the FXML document and as such has two attributes. The fx:controller attribute is required when you specify controller-based event handlers in your markup. The xmlns:fx attribute is always required and specifies the fx namespace.
The remainder of the code controls the alignment and spacing of the grid pane. The alignment property changes the default position of the grid from the top left of the scene to the center. The gap properties manage the spacing between the rows and columns, while the padding property manages the space around the edges of the grid pane.
As the window is resized, the nodes within the grid pane are resized according to their layout constraints. In this example, the grid remains in the center when you grow or shrink the window. The padding properties ensure there is a padding around the grid when you make the window smaller.
Add Text and Password Fields
Looking back at Figure 4-1, you can see that the login form requires the title βWelcomeβ and text and password fields for gathering information from the user. The code in Example 4-4 is part of the GridPane layout and must be placed above the statement.
Example 4-4 Text, Label, TextField, and Password Field Controls
The next lines create a Label object with text User Name at column 0, row 1 and a TextField object to the right of it at column 1, row 1. Another Label and PasswordField object are created and added to the grid in a similar fashion.
When working with a grid layout, you can display the grid lines, which is useful for debugging purposes. In this case, set the gridLinesVisible property to true by adding the statement true right after the
statement. Then, when you run the application, you see the lines for the grid columns and rows as well as the gap properties, as shown in Figure 4-2.
Figure 4-2 Login Form with Grid Lines
Description of «Figure 4-2 Login Form with Grid Lines»
Add a Button and Text
Example 4-5 HBox, Button, and Text
Assigning an fx:id value to an element, as shown in the code for the Text control, creates a variable in the document’s namespace, which you can refer to from elsewhere in the code. While not required, defining a controller field helps clarify how the controller and markup are associated.
Add Code to Handle an Event
Now make the Text control display a message when the user presses the button. You do this in the FXMLExampleController.java file. Delete the code that NetBeans IDE generated and replace it with the code in Example 4-6.
Example 4-6 FXMLExampleController.java
The @FXML annotation is used to tag nonpublic controller member fields and handler methods for use by FXML markup. The handleSubmtButtonAction method sets the actiontarget variable to Sign in button pressed when the user presses the button.
You can run the application now to see the complete user interface. Figure 4-3 shows the results when you type text in the two fields and click the Sign in button. If you have any problems, then you can compare your code against the FXMLLogin example.
Figure 4-3 FXML Login Window
Description of «Figure 4-3 FXML Login Window»
Use a Scripting Language to Handle Events
As an alternative to using Java code to create an event handler, you can create the handler with any language that provides a JSR 223-compatible scripting engine. Such languages include JavaScript, Groovy, Jython, and Clojure.
Optionally, you can try using JavaScript now.
In the Button markup, change the name of the function so the call looks as follows:
Remove the fx:controller attribute from the GridPane markup and add the JavaScript function in a
Π£ΡΠ΅Π±Π½ΠΈΠΊ ΠΏΠΎ JavaFX: FXML ΠΈ SceneBuilder
ΠΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Ρ JavaFX, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠΊΡ FXML ΠΈ SceneBuilder.
ΠΡΠ΅ ΠΏΠΎΡΡΡ Π² ΡΠ΅ΡΠΈΠΈ ΠΎ JavaFX:
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ±
ΠΡΠΎΡΡΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ β ΠΊΠΎΠ΄ Π²ΡΠ³Π»ΡΠ΄Π΅Π» ΡΠ°ΠΊ:
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅ Π²Π΅ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠΎΠ·Π΄Π°Π½ Π² Java ΠΊΠΎΠ΄Π΅.
ΠΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π½ΠΎ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²Π²ΠΎΠ΄ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΠ²Π½Π΅ΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΠΌΠ°ΠΊΠ΅ΡΠΎΠ² ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΡΠΌ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎ Π΅ΡΠ΅ Π½Π΅ Π²ΡΠ΅ β Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠ»Π°ΡΡΠ΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΡΡΡΠΊΡΡΡΡ, Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΡΠ΅ΠΊΡΡ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
Π£ ΠΊΠ»Π°ΡΡΠ° ΡΠ²Π½ΠΎ Π½Π΅Ρ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ. Π‘ΡΠ°Π²Π½ΠΈΡΠ΅ ΡΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° ΠΈΠΌΠ΅Π΅Ρ ΡΠ΅ΡΠΊΠΎ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ:
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌ FXML
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΈΠΌΠ΅ΡΡ Π²Π΅ΡΡ ΠΊΠΎΠ΄ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Π½Π΅ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠ°Ρ ΠΈΠ΄Π΅Ρ. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ Π±ΡΠ»ΠΎ Π»Π΅Π³ΡΠ΅ ΠΏΠΎΠ½ΡΡΡ ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΌ.
Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅ Π²Ρ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΠ΅ ΠΊ Π²Π°ΡΠΈΠ°Π½ΡΡ Β«Model-View-WhateverΒ» β ΡΡΠΎ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ Β«Model View ControllerΒ», Β«Model View PresenterΒ» ΠΈΠ»ΠΈ Β«Model View ViewModelΒ».
ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΡΠ°ΠΌΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡ ΠΏΠ»ΡΡΡ ΠΈ ΠΌΠΈΠ½ΡΡΡ ΡΠ°Π·Π½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² β Π΄Π°Π²Π°ΠΉΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π·Π΄Π΅ΡΡ. ΠΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ ΡΠΎ, ΡΡΠΎ Ρ JavaFx Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ .
ΠΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠΊΡ XML.
ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° XML β ΡΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠΏΠΈΡΠ°ΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅. HTML ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Ρ ΠΎΡΠΎΡΠΎ, Π²Π΅ΡΠ½ΠΎ?
Π€ΠΎΡΠΌΠ°Ρ XML, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΉ Π΄Π»Ρ JavaFX, Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ FXML. Π Π½Π΅ΠΌ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ²ΡΠ·Π°ΡΡ ΠΈΡ Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ.
ΠΠ°Π³ΡΡΠ·ΠΊΠ° FXML ΡΠ°ΠΉΠ»ΠΎΠ²
ΠΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π°Ρ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°ΠΏΡΡΠΊΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ FXML?
ΠΠ΄Π΅ΡΡ root ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Ρ Π² Π½Π΅Π³ΠΎ.
ΠΠ΅ΡΠΎΠ΄ load ΠΈΠΌΠ΅Π΅Ρ generic Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏ, Π° Π½Π΅ Parent. ΠΠ°Π»Π΅Π΅, Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ. ΠΠ΄Π½Π°ΠΊΠΎ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π²Π°Ρ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Ρ ΡΡΠΏΠΊΠΈΠΌ. ΠΡΠ»ΠΈ Π²Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠΈΠΏ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π² Π²Π°ΡΠ΅ΠΌ FXML, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Π΅ΡΡΡ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΠΈΠΏΠ°, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² Π²Π°ΡΠ΅ΠΌ FXML ΠΈ Π² Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ΅ Java FXML.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ FXML ΡΠ°ΠΉΠ»Π°
ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° Π² Π΅Π³ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²Π²Π΅ΡΡΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ XML:
ΠΠΌΠΏΠΎΡΡ
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π² ΡΠ°ΠΉΠ», Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΈΠΌΠΏΠΎΡΡΠ°. ΠΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΠΈΠΌΠΏΠΎΡΡ Π² Java ΠΊΠ»Π°ΡΡΠ°Ρ . ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΠΊΠΈ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»Π° ΠΈΠΌΠΏΠΎΡΡΠ°:
Π₯ΠΎΡΠΎΡΠ΅ΠΉ Π½ΠΎΠ²ΠΎΡΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΈΠΌΠΏΠΎΡΡΠ° Π²ΡΡΡΠ½ΡΡ, Π²Π°ΡΠ° IDE Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠΌΠΎΡΡ Π²Π°ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΈΠΌΠΏΠΎΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΈΡ Π² ΠΊΠ»Π°ΡΡΡ Java.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΡΠ»ΠΎ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ. Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ·Π½Π°Π»ΠΈ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΡΠ΅Π½Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π΄Π°Π²Π°ΠΉΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΡΠΎΡΡΡΡ ΠΌΠ΅ΡΠΊΡ (label):
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΌΠ΅ΡΠΊΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° β ΡΡΠΎ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠ±ΡΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠ°ΠΊΠ΅Ρ (layout), ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ Π΄Π»Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠ΅Ρ ΠΈΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΌΠ°ΠΊΠ΅ΡΡ ΠΏΠΎΠ·ΠΆΠ΅ Π² ΡΡΠΎΠΉ ΡΠ΅ΡΠΈΠΈ, Π° ΡΠ΅ΠΉΡΠ°Ρ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠΎΡΡΡΠΌ VBox, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅Ρ ΡΠ²ΠΎΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΠΎ Π΄ΡΡΠ³ Π½Π°Π΄ Π΄ΡΡΠ³ΠΎΠΌ.
FX Namespace
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΏΠ°ΡΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² FXML, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π½ (Namespace) FXML, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ. ΠΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½ fx. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ Π² Π½Π°ΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:
ΠΡΡΠΈΠ±ΡΡ fx:id ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΡΠ°ΡΡΠ΅ΠΉ Π½Π°ΡΠ΅Π³ΠΎ FXML ΠΈ Π΄Π°ΠΆΠ΅ ΠΈΠ· Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°.
Π‘ΠΊΡΠΈΠΏΡΡ
ΠΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ° ΡΡΠ°ΡΠΈΡΠ½ΠΎ. ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠΊ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°, Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΡΡΠ΅Π°Π³ΠΈΡΡΠ΅ΠΌ Π½Π° Π½Π°ΠΆΠ°ΡΠΈΠ΅ Π½Π°ΡΠ΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ Β«Click me!Β» Π½Π° Β«Click me again!Β».
ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠ±ΡΡΠΈΡ onAction Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° fx:id, ΡΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅ Π΄Π»Ρ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ.
Π’Π΅ΠΏΠ΅ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½Π° Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΡ. ΠΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π²Π½ΡΡΡΠΈ ΡΠ΅Π³Π° fx:script. ΠΠ°ΠΆΠ½ΠΎ ΡΠΎ, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ·ΡΠΊΠΈ Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ°, JavaScript, Groovy ΠΈΠ»ΠΈ Clojure. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° JavaScript:
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΌΡ ΡΡΡΠ»Π°Π΅ΠΌΡΡ Π½Π° Π½Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Button Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° mainButton, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΡΠ°ΠΊ:
Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΡΠ·ΡΠΊ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π² ΡΠ°ΠΉΠ»Π΅ FXML:
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ΅ΠΊΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ?
Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ fx:id ΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΊΡΠΈΠΏΡΠ° Π½Π° JavaScript. ΠΠ΅ΡΠΆΠ΅Π»ΠΈ ΡΡΠΎ ΡΠΎ, ΡΡΠΎ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π΄Π΅Π»Π°ΡΡ?
ΠΡΠ²Π΅Ρ β Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² Π½Π΅Ρ. ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ. ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Π²Π²Π΅Π΄Π΅Π½ FXML, Π±ΡΠ»Π° ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ² β ΡΡΠΎΠ±Ρ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. Π ΡΡΠΎΠΌ ΡΠΊΡΠΈΠΏΡΠ΅ ΡΠ½ΠΎΠ²Π° Π²Π΅ΡΠ½ΡΠ»ΠΎΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ»ΠΈΡΠ½ΠΎΠ΅ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Ρ ΠΊΠΎΠ΄ΠΎΠΌ Java, Π° Ρ XML, Π±ΡΠ»ΠΈ ΡΡΡΠ°ΡΠ΅Π½Ρ Π²ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠΎΠ΄Π° Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΡΠΈΠΏΠΎΠ². Π’Π΅ΠΏΠ΅ΡΡ Π²ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π±ΡΠ΄ΡΡ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π° Π½Π΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π»ΠΎ ΠΎΡΠ΅Π½Ρ Ρ ΡΡΠΏΠΊΠΈΠΌ ΠΈ ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½ΡΠΌ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°
ΠΡΠ°ΠΊ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²? ΠΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Ρ Π½Π°ΡΠΈΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ FXML. ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ β ΡΡΠΎ Java ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅ΡΠ½ΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΡΠΈΠΏΠΎΠ² ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ POJO, ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°ΡΡΠΈΡΡΡΡ ΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ.
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°ΡΡ ΠΊΠ»Π°ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Ρ Π½Π°ΡΠΈΠΌ FXML? ΠΠΎ ΡΡΡΠ΅ΡΡΠ²Ρ, Π΅ΡΡΡ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ°.
ΠΠ° Java
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΠ΅ Π²Π°ΡΠΈΠΌ FXMLLoader.
Π FXML
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠ»Π°ΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΠΊΠ°ΠΊ Π°ΡΡΠΈΠ±ΡΡ fx:controller, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅.
ΠΡΠ»ΠΈ Π²Ρ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΠΊΠ»Π°ΡΡ Controller Π² FXML, ΠΎΠ½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π΄Π»Ρ Π²Π°Ρ. ΠΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ΄Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ β Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², ΡΡΠΎΠ±Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Controller.
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ FXML:
ΠΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠΊΡΠΈΠΏΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΏΡΡΠΌΠΎ Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅:
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΡ onAction Π½Π°ΡΠ΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π§ΡΠΎΠ±Ρ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ· Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΠΊ # ΠΏΠ΅ΡΠ΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Π°:
ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ, ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ MainSceneController.buttonClicked(). ΠΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ public. ΠΡΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π΄ΠΎΡΡΡΠΏΠ° Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠΎΠ³ΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @FXML.
ΠΠ½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ
ΠΠΎΠΊΠ° ΡΡΠΎ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ°ΡΠ°Π΅ΠΌ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ. Π§ΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠ½ΠΎΠ²Π° Π·Π°Ρ ΠΎΡΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅ΠΊΡΡ Π½Π°ΡΠ΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π° Β«Click me againΒ»? ΠΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π² Π½Π°ΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅?
Π ΡΡΠ°ΡΡΡΡ, ΡΡΠΎ Π»Π΅Π³ΠΊΠΎ. ΠΠΎΠΌΠ½ΠΈΡΠ΅ ΡΡΠΈ Π°ΡΡΠΈΠ±ΡΡΡ fx:id?
JavaFX ΠΏΡΡΠ°Π΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Ρ fx:id Ρ ΠΏΠΎΠ»ΡΠΌΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ Π² Π²Π°ΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅ Ρ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ.
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΠΏΠΈΡΠ°Π½Π½Π°Ρ Π²ΡΡΠ΅ Ρ
JavaFX ΠΏΡΡΠ°Π΅ΡΡΡ Π²Π½Π΅Π΄ΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² Π²Π°Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π² ΠΏΠΎΠ»Π΅ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ mainButton:
ΠΠ°ΠΊ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π°Ρ , Π²Π°ΡΠΈ ΠΏΠΎΠ»Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ public ΠΈΠ»ΠΈ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ @FXML.
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΡΠ»ΠΊΠ° Π½Π° Π½Π°ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ, ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΅Π΅ ΡΠ΅ΠΊΡΡ:
Scene Builder
ΠΠ°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²Π°ΡΠ΅ΠΉ ΡΡΡΡΠΊΡΡΡΡ GUI Π² XML ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ, ΡΠ΅ΠΌ Π² Java (ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ HTML). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ ΡΡΠΎ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ. Π₯ΠΎΡΠΎΡΠ΅ΠΉ Π½ΠΎΠ²ΠΎΡΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Scene Builder, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²Π°ΠΌ Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. Π Π΄Π²ΡΡ ΡΠ»ΠΎΠ²Π°Ρ , ΡΡΠΎ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
Π ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅ ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΡΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΎΠ±Π»Π°ΡΡΠΈ:
Standalone
Scene Builder ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΠΊΠ°ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ FXML ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ IntelliJ IDEA
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ, Scene Builder ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ IDE.
Π IntelliJ IDEA Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΆΠ°ΡΡ ΠΏΡΠ°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡΡΠΈ Π½Π° Π»ΡΠ±ΠΎΠΌ FXML ΡΠ°ΠΉΠ»Π΅ ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΡΠ±ΡΠ°ΡΡ ΠΎΠΏΡΠΈΡ ΠΌΠ΅Π½Ρ Β«ΠΡΠΊΡΡΡΡΒ» Π² SceneBuilder.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ, IntelliJ IDEA ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅Ρ SceneBuilder Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² IDE. ΠΡΠ»ΠΈ Π²Ρ ΠΎΡΠΊΡΠΎΠ΅ΡΠ΅ ΡΠ°ΠΉΠ» FXML Π² IDEA, Π² Π½ΠΈΠΆΠ½Π΅ΠΉ ΡΠ°ΡΡΠΈ ΡΠΊΡΠ°Π½Π° ΠΏΠΎΡΠ²ΡΡΡΡ Π΄Π²Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ
Π IntelliJ IDEA ΠΌΠΎΠΆΡΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° SceneBuilder:
Settings β Languages & Frameworks β JavaFX β Path to SceneBuilder