Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    12

    Binding di un tipo enumerativo con RadioButton

    Ciao a tutti,

    sto tentando di collegare in lettura scrittura una proprietà di tipo enumerativo con una coppia di pulsanti di opzione (JRadioButton). Per il binding sto usando la libreria beansbinding-1.2.1.jar.

    Dopo vari tentativi sono riuscito ad ottenere il risultato voluto, ma i pulsanti hanno un brutto comportamento: devo cliccare 2 volte un pulsante per selezionarlo effettivamente e settare la proprietà bound. Il primo click si limita a spostare il focus sul pulsante ma non lo seleziona e ottengo questo errore:
    "Exception in thread "AWT-EventQueue-0" org.jdesktop.beansbinding.PropertyResolutionExcept ion: Exception invoking method public void org.jdesktop.swingbinding.adapters.AbstractButtonA dapterProvider$Adapter.setSelected(boolean) on org.jdesktop.swingbinding.adapters.AbstractButtonA dapterProvider$Adapter@9a9b65".

    Col secondo click invece questo errore non si verifica, il pulsante si seleziona e la proprietà collegata si aggiorna coerentemente.
    Allego una cartella del demo nella speranza che qualcuno ci voglia dare un'occhiata e magari trovi una soluzione.

    Grazie,

    Marco

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    12
    Mi ricordo solo adesso che non posso allegare cartelle zippate ma solo immagini (peccato però!!!).
    Allora il codice è questo (sono 4 file)

    1 classe:
    codice:
    package MyPack;
    
    public class Pulizia extends AbstractModelObject{
    
    public Pulizia (MetodoPulizia metpuliz){
    setMetodoUtilizzato(metpuliz);
    }
    public enum MetodoPulizia {
    MANUALE("olio di gomito"),
    MECCANICO("con motore elettrico") ;
    private String description;
    
    //constructor
    private MetodoPulizia (String description) {
    this.description = description;
    }  	    
    
    //add a getter for description
    public String getDescription(){
    return description;
    }
    }
    
    private MetodoPulizia metodoUtilizzato;
    
    public MetodoPulizia getMetodoUtilizzato() {
    return this.metodoUtilizzato;
    } 	
    
    public void setMetodoUtilizzato(MetodoPulizia metpul) {
    MetodoPulizia oldMetodo =  getMetodoUtilizzato() ;
    this.metodoUtilizzato = metpul;
    firePropertyChange("metodoUtilizzato", oldMetodo, this.metodoUtilizzato);
    } 
    }
    2 classe: Il converter
    codice:
    package MyPack;
    
    import org.jdesktop.beansbinding.Converter;
    
    import MyPack.Pulizia.MetodoPulizia;
    
    public class EnumToBooleanConverter extends Converter <MetodoPulizia, Boolean>{
    
    private MetodoPulizia o;
    
    public EnumToBooleanConverter () {}
    
    public EnumToBooleanConverter (MetodoPulizia o) {
    this.o = o;
    }
    
    @Override
    public Boolean convertForward(MetodoPulizia arg0) {
    return (o != null && o.equals(arg0)) ? Boolean.TRUE : Boolean.FALSE;
    }
    
    @Override
    public MetodoPulizia convertReverse(Boolean arg0) {
    return (MetodoPulizia) ((Boolean.TRUE.equals(arg0)) ? o : null);
    }
    }
    3 file - la Classe astratta per gli ascoltatori
    codice:
    package MyPack;
    
    import java.beans.PropertyChangeListener;
    import java.beans.PropertyChangeSupport;
    
    /**
     * @author lobas_av
     * 
     */
    public abstract class AbstractModelObject {
    private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
    
    public void addPropertyChangeListener(PropertyChangeListener listener) {
    propertyChangeSupport.addPropertyChangeListener(listener);
    }
    
    public void addPropertyChangeListener(String propertyName,PropertyChangeListener listener) {
    propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
    }
    
    public void removePropertyChangeListener(PropertyChangeListener listener) {
    propertyChangeSupport.removePropertyChangeListener(listener);
    }
    
    public void removePropertyChangeListener(String propertyName,PropertyChangeListener listener) {
    propertyChangeSupport.removePropertyChangeListener(propertyName,listener);
    }
    
    protected void firePropertyChange(String propertyName, Object oldValue,Object newValue) {
    propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
    }
    }
    e infine il pannello, (per semplicità ha il metodo main per lanciarlo da solo)
    codice:
    package MyPack;
    
    import javax.swing.JPanel;
    import net.miginfocom.swing.MigLayout;
    
    import javax.swing.ButtonGroup;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JRadioButton;
    import javax.swing.JLabel;
    
    import MyPack.Pulizia.MetodoPulizia;
    import org.jdesktop.beansbinding.BeanProperty;
    import org.jdesktop.beansbinding.AutoBinding;
    import org.jdesktop.beansbinding.Bindings;
    import org.jdesktop.beansbinding.AutoBinding.UpdateStrategy;
    import org.jdesktop.beansbinding.Converter;
    
    import javax.swing.JTextField;
    
    public class PuliziaPanel extends JPanel {
    
    	/**
    	 * 
    	 */
    private static final long serialVersionUID = 1L;
    
    	/**
    	 * Create the panel.
    	 */
    Pulizia pulizia = new Pulizia(MetodoPulizia.MANUALE);
    	
    Converter<MetodoPulizia, Boolean> converterMetodoManuale= new EnumToBooleanConverter(MetodoPulizia.MANUALE);
    Converter<MetodoPulizia, Boolean> converterMetodoMeccanico = new EnumToBooleanConverter(MetodoPulizia.MECCANICO);
    	
    private final ButtonGroup buttonGroup = new ButtonGroup();
    private JRadioButton rdbtnPuiliziaMeccanica = new JRadioButton("Pulizia meccanica");
    private JRadioButton rdbtnPuliziaManuale = new JRadioButton("Pulizia manuale");
    private final JTextField textField = new JTextField();
    	
    public PuliziaPanel() {
    pulizia.setMetodoUtilizzato(MetodoPulizia.MECCANICO);
    textField.setColumns(10);
    setLayout(new MigLayout("", "[][grow][]", "[][][][grow]"));
    		
    JLabel lblMetodoUtilizzato = new JLabel("Metodo utilizzato");
    add(lblMetodoUtilizzato, "cell 1 0,alignx center");
    		
    add(rdbtnPuliziaManuale, "cell 1 1");
    buttonGroup.add(rdbtnPuliziaManuale);
    		
    add(rdbtnPuiliziaMeccanica, "cell 1 2");
    buttonGroup.add(rdbtnPuiliziaMeccanica);
    		
    add(textField, "cell 1 3,growx");
    
    initDataBindings();
    
    }
    	
    	/**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
    private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    //Create and set up the content pane.
    JComponent newContentPane = new PuliziaPanel();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);
     
    //Display the window.
    frame.pack();
    frame.setVisible(true);
    }
     
    public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    createAndShowGUI();
    }
    });
    }
    
    protected void initDataBindings() {
    BeanProperty<Pulizia, MetodoPulizia> puliziaBeanProperty = BeanProperty.create("metodoUtilizzato");
    BeanProperty<JRadioButton, Boolean> jRadioButtonBeanProperty = BeanProperty.create("selected");
    AutoBinding<Pulizia, MetodoPulizia, JRadioButton, Boolean> autoBinding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, pulizia, puliziaBeanProperty, rdbtnPuliziaManuale, jRadioButtonBeanProperty);
    autoBinding.setConverter(converterMetodoManuale);
    autoBinding.bind();
    
    AutoBinding<Pulizia, MetodoPulizia, JRadioButton, Boolean> autoBinding_1 = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, pulizia, puliziaBeanProperty, rdbtnPuiliziaMeccanica, jRadioButtonBeanProperty);
    autoBinding_1.setConverter(converterMetodoMeccanico);
    autoBinding_1.bind();
    
    BeanProperty<Pulizia, String> puliziaBeanProperty_1 = BeanProperty.create("metodoUtilizzato.description");
    BeanProperty<JTextField, String> jTextFieldBeanProperty = BeanProperty.create("text");
    AutoBinding<Pulizia, String, JTextField, String> autoBinding_2 = Bindings.createAutoBinding(UpdateStrategy.READ, pulizia, puliziaBeanProperty_1, textField, jTextFieldBeanProperty);
    autoBinding_2.bind();
    }
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    12

    RISOLTO (Spero!)

    Ho modificato un metodo del converter e ora sembra funzionare. Lo riporto nel caso interessi a qualcun altro.

    codice:
    @Override
    public MetodoPulizia convertReverse(Boolean arg0) {
    return (MetodoPulizia) ((Boolean.TRUE.equals(arg0)) ? MetodoPulizia.MECCANICO : MetodoPulizia.MANUALE);
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.