JavaFX рдЕрдЪреНрдЫрд╛ рд╣реИ!
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, JavaFX рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рд╣рдореЗрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдерд╛ред
рдЖрдзреБрдирд┐рдХ рдПрдкреАрдЖрдИ ред "рдмрд┐рд▓реНрдбрд░реЛрдВ" рдХреЗ рдмрд┐рдирд╛ рднреА, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЖрдзреБрдирд┐рдХ рджрд┐рдЦрддрд╛ рд╣реИред
рдХреБрд▓
рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╡рд┐рдХрд╛рд╕ ред рдЗрд╕реЗ рдЕрдкрдирд╛рдУред рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рддрд░реНрдХ рдХрдмрд╛рдбрд╝, рдЧреЗрдЯрд░реНрд╕ / рд╕реЗрдЯрд░ рд╕реЗ рдХреЛрдб рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИ - "рдиреАрдЪреЗ!"ред рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдШрдЯрдирд╛рдУрдВ, рджреЛ-рддрд░рдлрд╝рд╛ "рдмрд╛рдзреНрдпрдХрд╛рд░реА" рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред
FXMLред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдбрд┐рдЬрд╛рдЗрдирд░ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдУрд░реЗрдХрд▓ рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рджреГрд╢реНрдп рдЙрдкрдХрд░рдг рд╣реИ - "рдЬрд╛рд╡рд╛рдПрдлрдПрдХреНрд╕ рд╕реАрди рдмрд┐рд▓реНрдбрд░"ред рдореИрдВрдиреЗ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдХрд┐ рддрдм рд╣рдо рдирд┐рдпрдорд┐рдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдПрдлрдПрдХреНрд╕рдПрдордПрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдПрдлрдПрдХреНрд╕рдПрдордПрд▓ рдХреЛ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ - рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рджреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ, рдХреЛрдб рдФрд░ рдПрдлрдПрдХреНрд╕рдПрдордПрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рд╛рде рд╣реА, рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред
рдиреЛрдбреНрд╕ред рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ред рдЖрдк рдПрдХ рдкреЗрдбрд╝ рдкрд░ рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд▓реБрдХрдЕрдк рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ ()ред рдЬреИрд╕реЗ рдбреЛрдо рдореЗрдВред рд╕рд┐рд░реНрдл jQuery рд▓рд┐рдЦреЗрдВред
рд╕реАрдПрд╕рдПрд╕ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрд╛рдд рд╣реИред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реАрдПрд╕рдПрд╕-рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ "рдлреЗрдВрдХ рджреЗрдВ"ред рдЖрдИрдбреА schnicks, CSS рдХрдХреНрд╖рд╛рдПрдВ, рдЪрдпрдирдХрд░реНрддрд╛ рдФрд░ рдЫрджреНрдо рдЪрдпрдирдХрд░реНрддрд╛ред
рдкрд╛рда рдЗрдВрдЬрди рдЬрдЯрд┐рд▓ рдЧреНрд░рдВрдереЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЗрдВрдЬрдиред
WebViewред рд╣рдо рд╡реЗрдмрдХрд┐рдЯ рдЗрдВрдЬрди рдкрд░ рдкрд░рд┐рд╖реНрдХреГрдд рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкрдврд╝реЗрдВ ред
рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рди рд╣реЛ
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред рдХреНрдпрд╛ рдмреБрд░рд╛ рд╣реИ? рдПрдХ рд╕рдордп рдореЗрдВ JavaFX рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд┐рдВрдбреЗрдмрд▓ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдмрдирд╛рдирд╛ рдПрдХ рдХрджрдо рдкреАрдЫреЗ рдФрд░ рдХрд▓ рд╣реИред рдЬрд╛рд╡рд╛ рдпрд╣рд╛рдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред Java 8 рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рднреА рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдбрд┐рдирд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ред
рдЧреНрд░реВрд╡реА!
рд╣рдордиреЗ рдЧреНрд░реВрд╡реА рдХреЛ рдЪреБрдирдХрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдкреБрд░рд╛рдирд╛ (рдкрд░рд┐рдкрдХреНрд╡) рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЖрдИрдбрд┐рдпрд╛ рдореЗрдВ рдмрдирд╛рдП рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЧреНрд░реВрд╡реА рдиреЗ рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рджрд╕ рдмрд╛рд░ рдХрд╛рдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдпрд╣ рд▓рдЧрднрдЧ рдЬрд╛рд╡рд╛ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдкрдврд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрдореНрдкреИрдХреНрдЯрдиреЗрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ!
JVM рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рдФрд░ рд╕реБрдВрджрд░ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдЧреНрд░реВрд╡реА рдиреЗ рд╣рдореЗрдВ рд╕реВрдЯ рдХрд┐рдпрд╛ред рдФрд░ рд╣рдо рдХреЛрд╖реНрдардХ, рдПрдиреЛрдЯреЗрд╢рди рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдпрд╣рд╛рдВ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреБрдЫ рддреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЧреНрд░реВрд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдд рд╕рд╛рд▓ рдХрд╛ рдЕрдиреБрднрд╡ рдерд╛, рдФрд░ рдЬрдм рдЯреАрдо рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЬреНрдЮрд╛рдд рд╣реЛред
рд╡реИрд╕реЗ, рдЧреНрд░реЛрд╡реА рднрд╛рд╖рд╛рдУрдВ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ (
TIOBE рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 18
рд╡рд╛рдБ рд╕реНрдерд╛рди рд▓реЗрддрд╛ рд╣реИред
рд╣рдорд╛рд░реА рдкреНрд░рдерд╛рдУрдВ
рдЕрдм рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рдХреЛрдб рдЕрд╕рд▓реА рд╣реИред
рдШрдЯрдХ рд╡рд┐рдиреНрдпрд╛рд╕
рдмрд╕ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред
рдЬрд╛рд╡рд╛ рдореЗрдВ, рд╣рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрджрдо рд╕реЗ рдХрджрдо, рд▓рд╛рдЗрди рд╕реЗ рд▓рд╛рдЗрди рдХрд░рдирд╛ рдерд╛ред
Button button = new Button(); button.setFocusTraversable(false); button.setLayoutX(23); button.setPrefHeight(30); button.setPrefWidth(30); button.setText("ADD");
рдпрджрд┐ рдЖрдк рдЧреНрд░реВрд╡реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?
Button button = new Button(focusTraversable: false, layoutY: 23, prefHeight: 30, prefWidth: 30, text: "Add")
рдЧреНрд░реВрд╡реНрд╕, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рд╕реЗрдЯ / рдЙрдкрд╕рд░реНрдЧ рдХреЗ рдмрд┐рдирд╛ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ (рдЧреЗрдЯрд░реНрд╕, рд╕реЗрдЯрд░) рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рд╕реЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рдзрд┐ рд╣реИ, рддреЛ рдЗрд╕реЗ рдореВрд▓реНрдп рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрд╛рда = "рдЬреЛрдбрд╝реЗрдВ"ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдЧреНрд░реВрд╡реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░, рдПрдХ рдЦрд╛рдВрдЪреЗ рд╕реЗ рд╕реЗрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ / рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдирд╛ рдХреЛрдИ рдЧреБрдкреНрдд рдмрд╛рдд рдирд╣реАрдВ рд╣реИред
рдФрд░ рдирд┐рд░реНрдорд╛рдг рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ, рдЖрдк рдЬреЛрдбрд╝реЗ - рдирд╛рдо: рдорд╛рди рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрд╢рдкреЙрдк рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЧреНрд░реВрд╡реА рдореИрдкреНрд╕ рд╣реИ - [key1: value1, key2: value])ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрдИрдбреАрдИрдП рд╣рдореЗрдВ рдпрд╣ рд╕рдм рдмрддрд╛рддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИред
рдШрдЯрдХреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рддреБрд░рдВрдд рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ?
рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
menus.addAll( new Menu(text: "File", newItems: [ new MenuItem( text: "New Window", onAction: { t -> ApplicationUtil.startAnotherColtInstance() } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.N, KeyCombination.SHORTCUT_DOWN) ), new Menu(text: "New Project", newItems: [ newAs = new MenuItem( text: "New AS Project", id: "new-as", onAction: { t -> ProjectDialogs.newAsProjectDialog(scene, false) } as EventHandler<ActionEvent> ), newJs = new MenuItem( text: "New JS Project", id: "new-js", onAction: { t -> ProjectDialogs.newJsProjectDialog(scene, false) } as EventHandler<ActionEvent> ) ]), new SeparatorMenuItem(), new MenuItem( text: "Open Project", onAction: { t -> ProjectDialogs.openProjectDialog(scene, false) } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.O, KeyCombination.SHORTCUT_DOWN) ), recentProjectsSubMenu = new Menu(text: "Open Recent", newItems: [ clearRecentProjects = new MenuItem( text: "Clear List", onAction: { t -> RecentProjects.clear() } as EventHandler<ActionEvent> ), ]), new SeparatorMenuItem(), save = new MenuItem( text: "Save Project", id: "save", onAction: { t -> ProjectDialogs.saveProjectDialog() } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN), disable: true ), saveAs = new MenuItem( text: "Save As...", onAction: { t -> ProjectDialogs.saveAsProjectDialog(scene) } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN, KeyCombination.SHIFT_DOWN), ), new MenuItem( text: "Close Project", onAction: { t -> ProjectDialogs.closeProjectDialog() } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN), ), new SeparatorMenuItem(), new MenuItem( text: "Exit", onAction: { t -> ApplicationUtil.exitColt() } as EventHandler<ActionEvent> ), ]), new Menu(text: "Help", newItems: [ new MenuItem( text: "Open Demo Projects Directory", onAction: { t -> ProjectDialogs.openDemoProjectDialog(scene) } as EventHandler<ActionEvent> ), new MenuItem( text: "Open Welcome Screen", onAction: { t -> ProjectDialogs.openWelcomeScreen(scene) } as EventHandler<ActionEvent> ), ]) )
рдРрд╕рд╛ рдХреЛрдб рдПрдлрдПрдХреНрд╕рдПрдордПрд▓ рд╕реЗ рдХрдо рдкрдардиреАрдп рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ, рдЬрдЧрд╣ рдореЗрдВ, рдЖрдк рд╕рднреА рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдлрдПрдХреНрд╕рдПрдордПрд▓ рдкрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред рдФрд░ рдРрд╕реЗ рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдЧрддрд┐рд╢реАрд▓ рдЧреБрдг рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ
рдЪреМрдХрд╕ рдкрд╛рдардХ рдкреВрдЫреЗрдЧрд╛, рдореЗрдиреВ рдлрд╝реАрд▓реНрдб "newItems" рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ? рд╣рд╛рдВ, рдореЗрдиреВ рд╡рд░реНрдЧ рдореЗрдВ рдРрд╕реА рдХреЛрдИ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдФрд░ рд╣рдордиреЗ рдРрд╕реА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЖрдЗрдЯрдо рдлрд╝реАрд▓реНрдб рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ "рд╕реЗрдЯрдЗрдореЗрдЯреНрд╕ ()" рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ "getItems ()" рд╣реИ рдФрд░ рдЖрдк рдПрдХ рдирдпрд╛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрдиреВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рд╣рдордиреЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рдЬреЛрдбрд╝рд╛ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рдЬрд╛рд╡рд╛ рдЗрдХрд╛рдИ рдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рд╛рдЬрджреНрд░реЛрд╣ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рд╣реИред рд╣рдордиреЗ рдмрд╣реБрдд рд╕реА рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЧрддрд┐рд╢реАрд▓рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рддрдереНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордВрдЬрд╕реНрдп рдирд╣реАрдВ рдХрд░ рдкрд╛рдПред рдФрд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рдирд┐рдбрд░ рд╣реЛ рдЧрдпрд╛ред
рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╢реНрд░реЗрдгреА GroovyDynamicMethods рдореЗрдВ рдЪрд▓реЗ рдЧрдП рд╣реИрдВред рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ:
class GroovyDynamicMethods { private static inited = false static void init() { if(inited)return inited = true addSetter(javafx.scene.Node, "newStyleClass", { String it -> styleClass.add(it) }) addSetter(Parent, "newChildren", {List<MenuItem> it -> children.addAll(it) }) addSetter(Menu, "newItems", {List<MenuItem> it -> items.addAll(it) }) } private static void addSetter(Class clazz, String methodName, Closure methodBody) { addMethod(clazz, "set" + methodName.capitalize(), methodBody) } private static void addMethod(Class clazz, String methodName, Closure methodBody) { ExpandoMetaClass exp = new ExpandoMetaClass(clazz, false) exp."$methodName" = methodBody exp.initialize() clazz.metaClass = exp } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рдордиреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП IDEA рд╕рд┐рдЦрд╛рдпрд╛ рдХрд┐ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдпреЗ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред

рдЕрдм IDEA рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рд╕реЗ рдЕрд╡рдЧрдд рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ JavaFX API рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред
Bindable рдЧреБрдг рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдирд╛
рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрдХ рдЕрджреНрднреБрдд рдЪреАрдЬ рд╣реИред рд╣рдорд╛рд░реА рдЯреАрдо рдЗрд╕ рдордВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ - "рдпрджрд┐ рдмрдВрдзрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрдВрдзрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реЗрдВред" "... рддреЛ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред"
рдмреИрдВрдбрд┐рдВрдЧ рдЖрдкрдХреЛ рдПрдХ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдФрд░ рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдВрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпреВрдЖрдИ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реНрд╡рдпрдВ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдореЙрдбрд▓ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрди рдЧреБрдгреЛрдВ рддрд░реНрдХ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЪреЗрдХрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг:
CheckBox checkBox = new CheckBox(); checkBox.selectedProperty().bindBidirectional(selectedProperty);
рдФрд░ рдпрд╣рд╛рдБ рд╣рдо рдЪреЗрдХрдмреЙрдХреНрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ:
CheckBox checkBox = new CheckBox(); checkBox.selectedProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> value, Boolean before, Boolean after) { System.out.println("value = " + value); } });
рдЙрдкрдпреЛрдЧ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдРрд╕реЗ рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред
рдЬрд╛рд╡рд╛ рдРрд╕рд╛ рдкрд░рд┐рджреГрд╢реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (IDEA рдХреЛрдб рд╕реНрд╡рддрдГ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ)ред
private StringProperty name = new SimpleStringProperty();
рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЖрдИрдбреАрдИ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЕрдЪреНрдЫрд╛, рдХреНрдпрд╛ рдпрд╣ рдореВрд░реНрдЦрддрд╛ рдирд╣реАрдВ рд╣реИ? рд╣рдореЗрдВ рдпрд╣ рд╕рдм рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЗрд╕ рд╕рдм рдмрдХрд╡рд╛рд╕ рдХреЗ рдкреАрдЫреЗ рд╣рдо рдЕрдкрдиреЗ рддрд░реНрдХ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВред
рд╕рдорд╛рдзрд╛рди! рд╣рдо рдПрдПрд╕рдЯреА рдкрд░рд┐рд╡рд░реНрддрди рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордпред
рд╣рдорд╛рд░реА рд╕рдВрдкрддреНрддрд┐ (рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЬрд╛рд╡рд╛ рдореЗрдВ 10 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ) рдПрдХ рд░реЗрдЦрд╛ рдореЗрдВ рдЧреНрд░реВрд╡реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:
@FXBindable String name;
@FXBindable рдЖрдк GroovyFX рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк
рд╣рдорд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдордиреЗ рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рднреБрдирд╛рдпрд╛ рдФрд░ рдЖрдк рдЗрд╕реЗ
рдЧреАрдереВрдм рд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рде рд╣реА, рдЙрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди
.gdsl рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓
рдорд┐рд▓реЗрдЧреА , рдЬреЛ IDEA рдХреЛ рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди - рдСрдЯреЛрдХрд▓рд╛рдЗрдЯ, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рдПрдЧреАред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╕реЗрдЯрдирд╛рдо, рдЧреЗрдЯрдиреЗрдо, рдЧреЗрдЯрдирд╛рдордкреНрд░реЛрдкрд░реЗрдЯрд░реА рдореЗрдердб рднреА рдмрдирддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдирд╛рдо () рдкрджреНрдзрддрд┐ рднреА рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдХрдо рдЕрдХреНрд╖рд░ рд▓рд┐рдЦрдХрд░ рднреА рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рд╕реНрд╡рд╛рдж, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣рдо рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
this.nameInput.textProperty().bindBidirectional(this.name())
рдЕрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдиреАрдЪреЗ
рдореЗрдиреВ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЧреБрдордирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдореЗрдиреВ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдПрдХ "рд╢реЗрд▓" рд╣реИред
onAction: { t -> ProjectDialogs.newAsProjectDialog(scene, false) } as EventHandler<ActionEvent>
"рдХреЗ рд░реВрдк рдореЗрдВ EventHandler" рд╕рднреА рдЬрд╛рджреВ рд╣реИ рдХрд┐ рдЦрдЬрд╛рдиреЗ рдХреА рдмреЙрдбреА EventHandler рд╡рд░реНрдЧ рдХреЗ рд╕рдВрднрд╛рд▓ рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдП рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдХреНрд▓реАрдирд░ рдмрдирд╛рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рд╕реНрдорд╛рд░реНрдЯ рдЖрдИрдбрд┐рдпрд╛ рдПрдХ рддреНрд╡рд░рд┐рдд рдмрджрд▓рд╛рд╡ "рдХреНрд╡рд┐рдХ рдЯреВ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди" рдХреНрд╡рд┐рдХрдлрд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреНрд▓рд╛рд╕ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдореИрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ([рд╣реИрдВрдбрд▓рд░ 1: {}, рд╣реИрдВрдбрд▓рд░ 2: {}]) рдПрдХ рдФрд░ рд▓реЗрдЦрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
XML рдХрд╛ рдХрд╛рдо
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдореЗрдВ XML рдореЗрдВ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рд╕реЗ рд▓реЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдкрд╣рд▓реЗ рд╣рдо рдЖрджрдд рд╕реЗ рдмрд╛рд╣рд░ рдПрдХреНрд╕рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рдЕрдзрд┐рдХ рдкреНрд░рдмрдВрдзрдиреАрдп рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА - рдЬрд╛рд╡рд╛рдПрдлрдПрдХреНрд╕ рдХреЗ рдмрд╛рдЗрдВрдбреЗрдмрд▓ рдЧреБрдг рдмрдбрд╝реЗ рд╣реИрдВ, рдФрд░ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВред JAXB рдХреЛ рджреЗрдЦрд╛, рддреЛ рдмрд╣реБрдд рдмреБрд░рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ Groovy XML рдХреНрд░рдорд╛рдВрдХрдиред
XmlSlurper рдмрд┐рд▓реНрдЯ-рдЗрди Groovy SDK рдЖрдпрд╛ред
рдкреНрд░рддреНрдпреЗрдХ рдмреАрди рдореЙрдбрд▓ рджреЛ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ - buildXml рдФрд░ buildModel - рдХреНрд░рдорд╛рдВрдХрди рдФрд░ рдбреАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди
Closure buildXml(Project project) { return { 'launcher'(launcherType) 'browser-path'(browserPath) 'nodejs-path'(nodejsPath) 'console-value'(console) } } @Override void buildModel(Object node) { launcherType = node.'launcher' browserPath = node.'browser-path' nodejsPath = node.'nodejs-path' console = node.'console-value' }
BuildXml рд╡рд┐рдзрд┐ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдПрдХ рдмреБрдХрдорд╛рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИред рдпрд╣рд╛рдВ рдЬрд╛рджреВ рдЧреИрд░-рдореМрдЬреВрдж рддрд░реАрдХреЛрдВ рдФрд░ рдЧреБрдгреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдореЗрдВ рд╣реИред рдпрджрд┐ рдХреЛрдИ рднреА рдиреЛрдиреНрдЯреЗрдВрд╕реЗрдиреНрдЯ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдХрд╣рд▓рд╛рддреА рд╣реИ, рддреЛ рдПрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рдорд╛рди рдХрд┐рд╕реА рдЧреИрд░-рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ XML рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рдХреЛрдИ рдиреЙрдирдПрдХреНрд╕реЗрдВрд╕реЗрдиреНрдЯ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб XML рдиреЛрдб рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред
BuildModel рд╡рд┐рдзрд┐ рдиреЛрдб рддрд░реНрдХ рд▓реЗрддреА рд╣реИ, рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреА рд╣реИред
рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред Groovy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо IO рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рд╣рдореЗрдВ рд╣рд░ рдиреИрдиреЛрд╕реЗрдХрдВрдб рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реНрдпрд╕реНрдд рд╡реЗрдм рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рдерд╛, рдФрд░ рдЧреНрд░реВрд╡реА рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╡рд╣ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдареАрдХ рдерд╛ред
рдЧреНрд░реВрд╡реА рдПрд╕рдбреАрдХреЗ рдлрд╝рд╛рдЗрд▓ рд╕рд╣рд┐рдд рдЬрд╛рд╡рд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдпреЛрдЧреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЯреЗрдХреНрд╕реНрдЯ" рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрд╕ рд▓рд┐рдЦрдиреЗ / рдкрдврд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдпрд╛ "рд╕реНрдкреНрд▓рд┐рдЯрдПрдЪрд▓рд╛рдЗрди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ AntBuilder рдкрд╕рдВрдж рдЖрдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ:
def ant = new AntBuilder() ant.sequential { myDir = "test/to/" mkdir(dir:myDir) copy(todir:myDir) { fileset(dir:"text/from/") { include(name:"**/*.*") } } }
рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
def ant = new AntBuilder() def scanner = ant.fileScanner { fileset(dir: file) { include(name: "**/*.jpg") } } scanner.each{ printlt(it) }
рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ AntBuilder рдЕрдкрдиреЗ рд╕рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг ANT рд╣реИред рдЕрднреА рдФрд░ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИред рдЧреНрд░реИрдбрд▓ AntBuilder рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рддрдереНрдп рдХрд┐ рд╡рд╣рд╛рдВ рдЖрдк "рдЯреНрд╡рд┐рд╕реНрдЯ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИред
GPath рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЬрд╛рд╡рд╛рдПрдлрдПрдХреНрд╕ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рдж рд╕реЗ, рд╣рдордиреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЫреЛрд░реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдХрд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░ рджрд┐рдпрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
webView.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>() { @Override void onChanged(ListChangeListener.Change<? extends Node> change) { Set<jNode> scrolls = webView.lookupAll(".scroll-bar"); for (Node scroll : scrolls) { scroll.setVisible(false); } } });
рдЧреНрд░реВрд╡реА рдкрд░ рдПрдХ рд╣реА рдмрд╛рдд:
webView.childrenUnmodifiable.addListener({ change -> webView.lookupAll(".scroll-bar")*.visible = false } as ListChangeListener)
рд▓рдбрд╝рдирд╛ рдПрдирдкреАрдИ
рдСрдкрд░реЗрдЯрд░ "?" - рд╣рдорд╛рд░реА рд░рд╛рдп рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ, рдЖрдк рдЬрд╛рд╡рд╛ рд╕реЗ рдЧреНрд░реВрд╡реА рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред
model?.projectSettings?.projectPaths?.livePaths?.each{ println(it) }
рд╣рдо рдЗрд╕реЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХреА рдХрдо рд╕реЗ рдХрдо рдмреАрд╕ рд▓рд╛рдЗрдиреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╢рд╛рдпрдж рдпрд╣реА рд╡рд╣ рд╕рдм рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдпрд╛рдж рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рд╣рдордиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрдиреНрдп Groovy "рдЙрдкрд╣рд╛рд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ Groovy рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХреЗрдВ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдЧреНрд░реВрд╡реА рд╕реЗ рдХреНрдпрд╛ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрддрд┐рдХреА рд╕реЗ рдкрд░рд╣реЗрдЬ рдХрд┐рдпрд╛ред рд╣рдорд╛рд░реА рдЯреАрдо рдореЗрдВ, рд╣рдо рд╕рд╣рдордд рдереЗ рдХрд┐ рдХрд┐рд╕реА рднреА рдЪрд░ рдпрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рд╕реНрдЯреЙрдХрд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рдпрд╣рд╛рдВ рдЙрдирдореЗрдВ рд╕реЗ рдЖрдзрд╛ рдЖрдирдВрдж рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдорд┐рд╢реНрд░рдг рдФрд░ рдЕрддрд┐рднрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рдереЗред рд╣рдо рдХреЛрдб рдХреЛ рдПрдХ рдмреБрд░реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рддрд░рд╣ рдорд╛рдирддреЗ рд╣реИрдВ - рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдХреЙрдореНрдкреИрдХреНрдЯ, рдмрд▓реНрдХрд┐ рдирд┐рдпрдВрддреНрд░рд┐рдд, рд╕рдорд░реНрдерд┐рдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣реА рд╕рдм рд╣реИред рдЧреНрд░реВрд╡реА рдЬрд╛рд╡рд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ - рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдПрдПрд╕рдЯреА рд░реВрдкрд╛рдВрддрд░рдг рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдо, рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдпрд╣ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдФрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдЬрд╛рд╡рд╛ рдСрдЯреЛ-рдЬреЗрдирд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╣реИред рдФрд░ рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред
Codeorchestra.com рдкрд░рд┐рдпреЛрдЬрдирд╛
рд╕реНрдерд▓