рдПрдХ GUI рдХреЛ рд╕реНрдЯреЗрдЯ рдорд╢реАрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛

рдПрдХ рдмрдбрд╝реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЖрдиреЗ рдХреЗ рдмрд╛рдж, рдЬреЛ рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ JDialog рдпрд╛ JFrame рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рддрд░реНрдХ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕рдордЭрдирд╛ рдЕрднреА рднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдФрд░ рд╣рд░ рд╕рдордп рдЬрдм рдореИрдВ рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдореИрдВ рдХреБрдЫ рдРрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╕реЗ рдмрдЪреЗрдВрдЧреЗред



рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдЬреЛ рдореБрдЭреЗ рдЖрдИ рдереА: рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░реЙрдкрд░реНрдЯреАрдЪреЗрдВрдЬрд▓рд┐рд╕реНрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдерд┐рддрд┐ (рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрдврд╝реЗ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрди рддрддреНрд╡реЛрдВ, рдмрджрд▓реЗ рдореЗрдВ, рдЙрдирдХреА рдЕрдкрдиреА рдкреНрд░реЙрдкрд░реНрдЯреАрдЪреЗрдВрдЬрд▓рд┐рд╕реНрдЯрд░ рднреА рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднреА рджреВрд╕рд░реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдерд╛ рдХрд┐ рдПрдХ рдмрдЯрди рджрдмрд╛рдиреЗ рд╕реЗ рдЕрдиреНрдп рд╕рднреА рддрддреНрд╡реЛрдВ рдкрд░ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝реЗрдЧрд╛, рдФрд░ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╕рднреА рдЕрдзрд┐рдХ рд╣реИред рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рднреА рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ (рддрд╛рд░реНрдХрд┐рдХ рдирд┐рдпрдо рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рдереА, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЫреВрдЯ рдЧрдпрд╛ рдерд╛) рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧред

рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдордзреНрдпрд╕реНрде рдкреИрдЯрд░реНрди рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ, рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдирд╛ рдФрд░ рдмрд╛рддрдЪреАрдд рдХреЗ рддрд░реНрдХ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ JDialog рдХреЛ рдЫреЛрдЯреЗ JPanels рдореЗрдВ рддреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдХреБрдЫ рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдШреЗрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ, рд╣рдореЗрдВ рдЗрди JPanels рдХреА рдкрд░рд╕реНрдкрд░ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ JDialog рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реАрдзреА рд╣реИ, рддреЛ рдЯреВрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдХрд┐ JDialog рд╣рдореЗрд╢рд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрд╡рд╛рдж рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ "рдореИрдВ рдЕрднреА-рдЕрднреА рдмрдирд╛рдИ рдЧрдИ" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдЬрд┐рдХ рд╕реНрд╡рдпрдВ "I am рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрд╡рд╛рдж рдбрд╛рд▓рддрд╛ рд╣реИ, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "I am рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг" рд╕реНрдерд┐рддрд┐ рдХреЗ рджреМрд░рд╛рди рд░рджреНрдж рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдВрд╡рд╛рдж "рдкрд░ рдЬрд╛рддрд╛ рд╣реИ" рдореИрдВ рдмрд╛рдзрд┐рдд рд╣реЛ рдЧрдпрд╛ рдерд╛ред тАЭ

рддрд░реНрдХ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдордп рдореЗрдВ, рд╣рдо рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░, рдЗрд╕рд▓рд┐рдП, рддрддреНрд╡реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рднреА рдХреЛрдб рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рднреМрддрд┐рдХ рд╕реНрдерд╛рди рдореЗрдВ рд╣реЛрдВрдЧреЗред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░реЙрдкрд░реНрдЯреАрдЪреЗрдВрдЬрд▓рд┐рд╕реНрдЯрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреЗрдмрдЯрди рдХреЗ "рд░рджреНрдж" рдХреЛ JLabel рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдмрд╛рдж рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╣реА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрд╡рд╛рдж рд╣реИ рдЬреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдореЗрдВ рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдВрд╡рд╛рдж рд╡рд░реНрддрдорд╛рди рдкреНрд░рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рдЧрддрд┐ рдмрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рджреНрдж рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо JProgressBar рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рд╣рдордиреЗ рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдмрдЯрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рднреА рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЕрдЧрд░ рдЗрд╕реЗ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрдм рд╣рдорд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд░рд╛рдЬреНрдп "рдореИрдВ рдмрд╛рдзрд┐рдд рдерд╛" рдФрд░ startButton.setEnabled (рдЭреВрдард╛) рд╡рд╣рд╛рдБ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рд╣рдо рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ, рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ "рдореБрдЭреЗ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛"ред

рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд╡рд╛рдж рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдХрдо рд╢рдмреНрдж рдЕрдзрд┐рдХ рдХреЛрдб!

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рд╕рдВрд╡рд╛рдж рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рд╡рд░реНрдЧ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрддреНрддрд░ рдЬрд╛рдирддрд╛ рд╣реИ:
/** * class that can answer to the maing question * @author __nocach */ public class MeaningOfLifeAnswerer { public int answer(){ return 42; } } 


рдЪреВрдВрдХрд┐ рдЙрддреНрддрд░ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХреЗред рддреИрдпрд╛рд░реА рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ SwingWorker рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
 /** * worker that prepares MeaningOfLifeAnswerer * @author __nocach */ public class PrepareToAnswerMeaningOfLife extends SwingWorker<MeaningOfLifeAnswerer, Void>{ @Override protected MeaningOfLifeAnswerer doInBackground() throws Exception { Thread.sleep(1500); return new MeaningOfLifeAnswerer(); } } 


рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдвреВрдВрдврдирд╛ рднреА рдПрдХ рд▓рдВрдмрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рд┐рдВрдЧрд╡реЙрдХрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
 /** * worker that will retrieve answer to the main question using passed Answerer * @author __nocach */ public class RetrieveMeaningOfLife extends SwingWorker<Integer, Integer>{ private final MeaningOfLifeAnswerer answerer; public RetrieveMeaningOfLife(MeaningOfLifeAnswerer answerer){ if (answerer == null){ throw new NullPointerException("prepareProvider can't be null"); } this.answerer = answerer; } @Override protected Integer doInBackground() throws Exception { for(int i = 0; i < 100; i++){ Thread.sleep(10); setProgress(i); } return answerer.answer(); } } 


рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ: рд╕рдВрд╡рд╛рдж рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрд░реНрдердСрдлрд▓рд╛рдЗрдлрдСрдирд╕реНрд╡рд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрд░ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд░реНрдЪ рдХреЗ рд▓рд┐рдП рдмрдЯрди рдХреЛ рдбрд┐рд╕реЗрдмрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдЯреЗрдЯрд╕ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрд░реНрдердСрдлрд▓рд╛рдЗрдлрдПрдиреНрд╕реНрд╡рд╛рдпрд░ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА MeaningOfLifeAnswerer рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд░реНрдЪ рдХреЗ рд▓рд┐рдП рдмрдЯрди рдХреЛ рдСрди рдХрд░реЗрдВред рдЦреЛрдЬ рдмрдЯрди рджрдмрд╛рдХрд░, рд╣рдо RetrieveMeaningOfLife рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЦреЛрдЬ рдмрдЯрди рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рд▓рд┐рдЦреЗрдВ рдХрд┐ рд╣рдо рдЦреЛрдЬ рдореЗрдВ рд╣реИрдВред рдЙрддреНрддрд░ рдорд┐рд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдЦреЛрдЬ рдмрдЯрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдФрд░ рдЙрд╕ рдмрдЯрди рдкрд░ рд▓рд┐рдЦреЗрдВ рдЬрд┐рд╕реЗ рд╣рдо рдлрд┐рд░ рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
 public class StandardWay extends javax.swing.JFrame { private Logger logger = Logger.getLogger(StandardWay.class.getName()); private class FindAnswerAction extends AbstractAction{ private final MeaningOfLifeAnswerer answerer; public FindAnswerAction(MeaningOfLifeAnswerer answerer){ super("Find"); this.answerer = answerer; } @Override public void actionPerformed(ActionEvent e) { RetrieveMeaningOfLife retrieveWorker = new RetrieveMeaningOfLife(answerer); retrieveWorker.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("progress".equals(evt.getPropertyName())){ progressBar.setValue((Integer)evt.getNewValue()); } if ("state".equals(evt.getPropertyName())){ if (StateValue.STARTED.equals(evt.getNewValue())){ //    doButton.setText("In Search"); doButton.setEnabled(false); labelStatus.setText("searching..."); } if (StateValue.DONE.equals(evt.getNewValue())){ RetrieveMeaningOfLife worker = (RetrieveMeaningOfLife)evt.getSource(); try{ Integer answer = worker.get(); //   logger.info("got the answer"); JOptionPane.showMessageDialog(rootPane, "THE ANSWER IS " + answer); } catch(Exception ex){ //     logger.info("error while retrieving the answer"); JOptionPane.showMessageDialog(rootPane, "Error while searching for meaning of life"); } labelStatus.setText("answer was found"); doButton.setText("Find again"); doButton.setEnabled(true); } } } }); retrieveWorker.execute(); } } /** * listener that updates gui state by progress of PrepareToAnswerMeaningOfLife worker * @author __nocach * */ private class PrepareToAnswerMeaningOfLifeListener implements PropertyChangeListener{ @Override public void propertyChange(PropertyChangeEvent evt) { if ("state".equals(evt.getPropertyName())){ if (StateValue.STARTED.equals(evt.getNewValue())){ //      MeaningOfLifeAnswerer labelStatus.setText("Prepearing... "); doButton.setEnabled(false); logger.info("preparing..."); } if (StateValue.DONE.equals(evt.getNewValue())){ //           labelStatus.setText("I am prepared to answer the meaning of life"); doButton.setEnabled(true); PrepareToAnswerMeaningOfLife worker = (PrepareToAnswerMeaningOfLife)evt.getSource(); try{ doButton.setAction(new FindAnswerAction(worker.get())); logger.info("prepared"); } catch(Exception ex){ //    MeaningOfLifeAnswerer JOptionPane.showMessageDialog(rootPane, "failed to find answerer to the question"); dispose(); logger.severe("failed to prepare"); } } } } } /** Creates new form StandardWay */ public StandardWay() { initComponents(); PrepareToAnswerMeaningOfLife prepareWorker = new PrepareToAnswerMeaningOfLife(); prepareWorker.addPropertyChangeListener(new PrepareToAnswerMeaningOfLifeListener()); prepareWorker.execute(); } //... //     JFrame  //... private javax.swing.JButton doButton; private javax.swing.JLabel labelStatus; private javax.swing.JProgressBar progressBar; } 


рдЗрд╕рд▓рд┐рдП, рд░рд╛рдЬреНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрдб рджреЛ рдкреНрд░реЙрдкрд░реНрдЯреАрдЪреЗрдВрдЬрд┐рд╕реНрдЯрдирд░ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ (ReadyToAnswerMeaningOfLife рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдФрд░ RetrieveMeaningOfLife рдХрд╛рд░реНрдпрдХрд░реНрддрд╛)ред ReadyToAnswerMeaningOfLifeListener рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд╛ рддрд░реНрдХ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдХреА рддреИрдпрд╛рд░реА рдХреА рдкреНрд░рдЧрддрд┐ рдкрд░ рдирдЬрд░ рд░рдЦрддрд╛ рд╣реИред рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдХреЗ рдЙрддреНрддрд░ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рд╣рдо рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирд╛рдо рдкреНрд░реЙрдкрд░реНрдЯреАрдЪреЗрдВрдЬрд▓рд┐рд╕реНрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдкрд░реЛрдХреНрдд рд╕реВрдЪреА рдХреЛ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рдореЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ, рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд░рд╛рдЬреНрдп рдХреЗ рдкреВрд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЕрд▓рдЧ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ ViewToPreparing (), рдЬрд╣рд╛рдВ рдХреЛрдб
 private void setViewToPreparing(){ labelStatus.setText("Prepearing... "); doButton.setEnabled(false); logger.info("preparing..."); } 

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рд╕рдВрд╡рд╛рдж рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдРрд╕рд╛ рддрд╛рд░реНрдХрд┐рдХ рдЯреБрдХрдбрд╝рд╛ 20 рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╣реЛрдЧрд╛, рддреЛ рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреЛ рдФрд░ рднреА рдЫреЛрдЯреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП JFrame рд╡рд░реНрдЧ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдЬреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкрд░рд┐рдорд┐рдд рдСрдЯреЛрдореЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрдпрд╛ рд╣реЛрдЧрд╛:
 public class StateMachineWay extends javax.swing.JFrame { private Logger logger = Logger.getLogger(StandardWay.class.getName()); /** * controlls switching between gui states */ private GuiStateManager stateManager = new GuiStateManager(); private class PreparingAnswererState extends BaseGuiState{ @Override public void enterState() { labelStatus.setText("Prepearing... "); doButton.setEnabled(false); } } private class ReadyToFindTheAnswer extends BaseGuiState{ private final MeaningOfLifeAnswerer answerer; public ReadyToFindTheAnswer(MeaningOfLifeAnswerer answerer){ this.answerer = answerer; } @Override public void enterState() { labelStatus.setText("I am prepared to answer the meaning of life"); doButton.setEnabled(true); doButton.setAction(new FindAnswerAction(answerer)); } } private class FoundAnswerState extends BaseGuiState{ private final Integer answer; public FoundAnswerState(Integer answer){ this.answer = answer; } @Override public void enterState() { labelStatus.setText("answer was found"); doButton.setText("Find again"); doButton.setEnabled(true); JOptionPane.showMessageDialog(rootPane, "THE ANSWER IS " + answer); } } private class FailedToPrepareAnswerer extends BaseGuiState{ @Override public void enterState() { JOptionPane.showMessageDialog(rootPane, "failed to find answerer to the question"); dispose(); } } private class FailedToFoundAnswer extends BaseGuiState{ @Override public void enterState() { labelStatus.setText("failed to find answer"); doButton.setText("Try again"); doButton.setEnabled(true); JOptionPane.showMessageDialog(rootPane, "Error while searching for meaning of life"); } } private class SearchingForAnswer extends BaseGuiState{ @Override public void enterState() { labelStatus.setText("searching..."); doButton.setText("In Search"); doButton.setEnabled(false); } } /** * actions that starts worker that will find the answer to the main question * @author __nocach * */ private class FindAnswerAction extends AbstractAction{ private final MeaningOfLifeAnswerer answerer; public FindAnswerAction(MeaningOfLifeAnswerer answerer){ super("Find"); this.answerer = answerer; } @Override public void actionPerformed(ActionEvent e) { RetrieveMeaningOfLife retrieveWorker = new RetrieveMeaningOfLife(answerer); retrieveWorker.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("progress".equals(evt.getPropertyName())){ progressBar.setValue((Integer)evt.getNewValue()); } if ("state".equals(evt.getPropertyName())){ if (StateValue.DONE.equals(evt.getNewValue())){ RetrieveMeaningOfLife worker = (RetrieveMeaningOfLife)evt.getSource(); try{ Integer answer = worker.get(); stateManager.switchTo(new FoundAnswerState(answer)); logger.info("got the answer"); } catch(Exception ex){ logger.info("error while retrieving the answer"); stateManager.switchTo(new FailedToFoundAnswer()); } } if (StateValue.STARTED.equals(evt.getNewValue())){ stateManager.switchTo(new SearchingForAnswer()); } } } }); retrieveWorker.execute(); } } /** * listener that updates gui state by progress of PrepareToAnswerMeaningOfLife worker * @author __nocach * */ private class PrepareToAnswerMeaningOfLifeListener implements PropertyChangeListener{ @Override public void propertyChange(PropertyChangeEvent evt) { if ("state".equals(evt.getPropertyName())){ if (StateValue.STARTED.equals(evt.getNewValue())){ logger.info("preparing..."); stateManager.switchTo(new PreparingAnswererState()); } if (StateValue.DONE.equals(evt.getNewValue())){ PrepareToAnswerMeaningOfLife worker = (PrepareToAnswerMeaningOfLife)evt.getSource(); try{ MeaningOfLifeAnswerer meaningOfLifeAnswerer = worker.get(); stateManager.switchTo(new ReadyToFindTheAnswer(meaningOfLifeAnswerer)); logger.info("prepared"); } catch(Exception ex){ logger.severe("failed to prepare"); stateManager.switchTo(new FailedToPrepareAnswerer()); } } } } } /** Creates new form StandardWay */ public StateMachineWay() { initComponents(); PrepareToAnswerMeaningOfLife prepareWorker = new PrepareToAnswerMeaningOfLife(); prepareWorker.addPropertyChangeListener(new PrepareToAnswerMeaningOfLifeListener()); prepareWorker.execute(); } //... //     JFrame  //... private javax.swing.JButton doButton; private javax.swing.JLabel labelStatus; private javax.swing.JProgressBar progressBar; } 


рдореБрдЦреНрдп рд╡рд░реНрдЧ GuiStateManager рд╣реИрдВред
 /** * State machine of swing gui * @author __nocach */ public class GuiStateManager { private GuiState currentState = new EmptyState(); /** * makes passed state current * @param newState not null new state */ public synchronized void switchTo(GuiState newState){ if (newState == null){ throw new NullPointerException(); } currentState.leaveState(); currentState = newState; currentState.enterState(); } public GuiState current(){ return currentState; } } 

рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рд╡рд░реНрдЧ рдЬреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

рдФрд░ рд╡рд░реНрдЧ рд░рд╛рдЬреНрдп GuiState
 public interface GuiState { /** * called when entering to this state */ public void enterState(); /** * called when leaving this state */ public void leaveState(); } 


рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЕрдВрддрддрдГ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдП:
PreparingAnswererState,
ReadyToFindTheAnswer,
FoundAnswerState,
FailedToPrepareAnswerer,
FailedToFoundAnswer

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рд╛рд░реНрдб-рдХреЛрдбрд┐рдд рддрд░реНрдХ рдХреЗ рдмрдЬрд╛рдп, рдЕрдм рдПрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд░рдордг рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдирд╣реАрдВ:
 stateManager.switchTo(new ReadyToFindTheAnswer(meaningOfLifeAnswerer)); 

рддрддреНрд╡реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рднреА рддрд░реНрдХ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдерд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, ReadyToFindTheAnswer, рдЬреЛ рдЦреЛрдЬ рдмрдЯрди рдХреЛ рд╕рдХреНрд░рд┐рдп рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ JLabel рдХреЗ рд▓реЗрдмрд▓ рдФрд░ рдмрдЯрди рдмрджрд▓ рджреЗрддрд╛ рд╣реИ)ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд░рд╛рдЬреНрдп рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЛрдИ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╕рд┐рд░реНрдл рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП 5 рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдПрдХ рд░рд╛рдЬреНрдп рдХрд╛ рдирд╛рдо рд╣реИред

рдЕрдм, рдЬрдм рд╣рдо рдЕрд░реНрде рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рд╕рдордп рд╣рдордиреЗ рдЕрд░реНрдердСрдлрд▓рд╛рдЗрдлрдПрдиреНрд╕реНрд╡рд┐рдПрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ (рдЕрд░реНрдерд╛рдд, рд╣рдордиреЗ рдЙрддреНрддрд░ рдЦреЛрдЬ рдкреНрд░рд╛рд░рдВрдн рдмрдЯрди рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░ рджрд┐рдпрд╛ рд╣реИ) рд╣рдореЗрдВ рдмрд╕ рд░реЗрдбреАрдлрд╛рдЗрдВрдбрдЗрдВрдбрдПрдиреНрд╕реНрд╡рд┐рдПрд░ рд╕реНрдЯреЗрдЯ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рдкреЙрдк-рдЕрдк рд╕рдВрд╡рд╛рдж рдЬрд┐рд╕реЗ рд╣рдо рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдПрдХ рд╕рд╡рд╛рд▓ред

рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рд╡рд░реНрдЧ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ reflored рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ _locally_ рдмрд╛рд╣рд░реА JFrame рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪрд░ рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд┐рдП рдмрд┐рдирд╛ред рд░рд╛рдЬреНрдп рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмрд╛рдж рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг _forces_ рд╕рдВрд╡рд╛рдж рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдЫреЛрдЯрд╛ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣рд╛рдВ рдЖрдк рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдмрд░реНрдмрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрдкрд░реЛрдХреНрдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЛрдб рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдореИрдВ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВ рдЬрд┐рд╕рдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрдХ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд SwingStates рдврд╛рдВрдЪрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХрд╛рдлреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕реЛрдЪрд╛ рд╣реИред

рдЦреИрд░, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирдореВрдирд╛ рдХреЛрдб рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИред

Source: https://habr.com/ru/post/In130256/


All Articles