рд╕реНрд╡рд┐рдВрдЧ рдлреЙрд░реНрдо рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд┐рд╡ рд▓рд╛рдЗрдмреНрд░реЗрд░реА

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╣реБрдЖ рдерд╛ рдХрд┐ рдЬрд╛рд╡рд╛ рд╕реНрд╡рд┐рдВрдЧ рдореЗрдВ рдЬрд▓реНрджреА рд╕реЗ рдлреЙрд░реНрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдИ рдЬрд╛рдПред рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдХреИрд╕реЗ рдЖрдпрд╛ред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХрдИ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд╕реНрд╡рд┐рдВрдЧ-рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкрд╛рджрди рдЬрд╛рд╡рд╛-рдмреАрдиреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВред JDK рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИ, рдФрд░ "рдЖрдЙрдЯ рдСрдл рдж рдмреЙрдХреНрд╕" рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдЬреАрд╡рди рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
GridBagPanel panel = new GridBagPanel(){{ add( new JLabel( "Name" ), 0, 0 ); add( new JTextField( person.getName() ) {{ getDocument().addDocumentListener( new DocumentListener() { public void insertUpdate( final DocumentEvent e ) { person.setName( getText() ); } public void removeUpdate( final DocumentEvent e ) { person.setName( getText() ); } public void changedUpdate( final DocumentEvent e ) { person.setName( getText() ); } } ); }}, 0, 1 ); //      ... }}; 

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдХреЛрдб рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдЬреЛрдбрд╝рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВред

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

рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдПрдХ рд╡рд░реНрдЧ рджреЗрддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рдлреЙрд░реНрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
 Form<Person> form = FormBuilder.map( Person.class ).buildForm(); myFrame.add( form.asComponent() ); Person person = new Person(); person.setName( "john smith" ); // ... further initialization form.setValue( person ); 

рдШрдЯрдХ рд╕реНрдерд╛рди


рд╕рдВрднрд╡рддрдГ, 80% рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 2 рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдПрдХ рдирд╛рдо рдФрд░ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдмрд▓ред рдХреНрд▓рд╛рд╕рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╣ рд╣реИ: рд╣рдо рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдирд╛рдо рдкреВрдЫрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдШрдЯрдХ рдорд┐рд▓рддрд╛ рд╣реИред
 Form<Person> form = FormBuilder.map( Person.class ).with( new PropertyNameBeanMapper<Person>() {      @Override      public JComponent mapBean( PropertyNameContext<Person> ctx ) {        JPanel panel = new JPanel( new BorderLayout() );        panel.add( ctx.label( "name" ), BorderLayout.NORTH );        panel.add( ctx.editor( "name" ), BorderLayout.CENTER );        return panel;      } } ).buildForm(); 

рдХреНрдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдХреБрдЫ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
 Form<Person> form = FormBuilder.map( Person.class ).with( new SampleBeanMapper<Person>() {      @Override      protected JComponent mapBean( Person sample, SampleContext<Person> ctx ) {        Box box = Box.createHorizontalBox();        box.add( ctx.label( sample.getName() ) );        box.add( ctx.editor( sample.getName() ) );        return box;      } } ).buildForm(); 

рдпрджрд┐ рдЖрдк рдПрдХ рдирдореВрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдпрдиреЗрдорд┐рдХ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (CGLIB рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ), рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рддрд░реАрдХреЗ рдХрд╣рд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рджреГрд╖реНрдЯрд┐рдХреЛрдг рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЬреАрдпреВрдЖрдИ рд╣реИред

рдорд╛рдирдЪрд┐рддреНрд░рдг


Ctx.label () рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдЗрд╕реЗ JLabel рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ ctx.editor () рдХреНрдпрд╛ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП? рд╕рдВрджрд░реНрдн рдХреЗ рднреАрддрд░, рдХреБрдЫ рдорд╛рдирдЪрд┐рддреНрд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП, рдЙрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдВрдкрд╛рджрдХ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪрдпрди рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдЙрдард╛рдУред рдФрд░ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдХрд╕реНрдЯрдо рдШрдЯрдХ рд╣реИ? рдХрдИ рдмрд┐рдВрджреБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреГрддреАрдп-рдкрдХреНрд╖ рдХреИрд▓реЗрдВрдбрд░ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 class DateToDateChooserMapper implements TypeMapper<JDateChooser, Date> { public Class<Date> getValueClass() { return Date.class; } public JDateChooser createEditorComponent() { return new JDateChooser(); } public Date getValue( final JDateChooser editorComponent ) { return editorComponent.getDate(); } public void setValue(final JDateChooser editorComponent, final Date value) { editorComponent.setDate( value ); } public void handleChanges(final JDateChooser editorComponent, final ChangeHandler changeHandler) { editorComponent.getDateEditor() .addPropertyChangeListener( "date", new PropertyChangeListener() { public void propertyChange( final PropertyChangeEvent evt ) { changeHandler.onChange( BackgroundMarker.INSTANCE ); } } ); } } 


рдпрд╣рд╛рдБ ChangeHandler рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдШрдЯрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕реЗрдо рдХреЛ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд╡реИрд▓рд┐рдбреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред ValidationMarker рдХреЛ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, BackgroundMarker, рдЬреЛ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрд╕рдлрд▓ рдШрдЯрдХреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдПред

рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдкрд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ:
 Form<Person> form = FormBuilder.map( Person.class ).use( new StringToTextAreaMapper() ).buildForm(); 

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ:
 Form<Person> form = FormBuilder.map( Person.class ) .useForProperty( "description", new StringToTextAreaMapper() ) .buildForm(); 

рдлрд┐рд░, рдХреНрдпрд╛ рдбрд╛рдпрдиреЗрдорд┐рдХ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рддрд╛рд░ рдХреА рдмрдЬрд╛рдп рддрд░реАрдХреЛрдВ рд╕реЗ рдмрд╛рдБрдзрдирд╛, рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рдирд╛? рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рд╣рдж рддрдХ рдмреЛрдЭрд┐рд▓:
 Form<Person> form = FormBuilder.map( Person.class ).useForGetters( new GetterMapper<Person>() {      @Override      public void mapGetters( Person beanSample, GetterConfig config ) {        config.use( beanSample.getDescription(), new StringToTextAreaMapper() );      } } ).buildForm(); 


рдирд┐рд╖реНрдХрд░реНрд╖


рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓рд┐рдЦрд╛ рдерд╛, рдФрд░ рдЕрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдореБрджрд╛рдп рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЕрдм рдореИрдВ рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рдПрдбреЙрдкреНрдЯрд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдпрд╣ рдмрд╣реБрдд рд╣реА рдорд╛рдореВрд▓реА рд╣реИред рд╢рд╛рдпрдж рдореИрдВ рдЕрдЧрд▓реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдорд╛рд╡реЗрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдХреА Google рдХреЛрдб рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: code.google.com/p/swing-formbuilder
рдореИрдВрдиреЗ рд╕реВрддреНрд░реЛрдВ рдХреЛ GitHub: github.com/aeremenok/swing-formbuilder рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛

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


All Articles