Observer + Beans Binding no swing

0 respostas
furacao123

Aew galera estou estudando um pouco do MVC em ambiente desktop, e estou tentando fazer o seguinte.

Vi varios exemplos na internet sobre o Observer e o Beans Binding, quero fazer uma forma onde os campos de uma view estejam linkados com os atributos de um objeto, e ao alterar o valor do objeto seja disparado pelo Observer os dados alterados em outras views que usam o mesmo objeto por exemplo

tenho a classe circulo
public class Circulo extends Observable {

    private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
    private int raio;
    private double area;

    public Circulo() {
        super();
    }

    public void setRaio(int raio) {
        int oldRaio = this.raio;
        this.raio = raio;
        propertyChangeSupport.firePropertyChange("raio", oldRaio, raio);
        setChanged();
        notifyObservers();
        System.out.println(oldRaio + " - " + raio);
    }

    public int getRaio() {
        return raio;
    }

    public void setArea(double area) {
        double oldArea = this.area;
        this.area = area;
        propertyChangeSupport.firePropertyChange("area", oldArea, area);
        setChanged();
        notifyObservers();
        System.out.println(oldArea + " - " + area);
    }

    public double getArea() {
        return area;
    }

    public double calculaArea() {
        return Math.pow(this.raio, 2) * Math.PI;
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }
}
Agora as views
public class RaioCirculoView extends javax.swing.JFrame {
    
    private Circulo circulo;

    public RaioCirculoView() {
        this.circulo = new Circulo();
        initComponents();
    }

    public Circulo getCirculo() {
        return circulo;
    }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        jPanel1 = new javax.swing.JPanel();
        btnCalcular = new javax.swing.JButton();
        btnSair = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        txtRaio = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setLayout(null);

        btnCalcular.setText("Calcular");
        jPanel1.add(btnCalcular);
        btnCalcular.setBounds(30, 30, 73, 23);

        btnSair.setText("Sair");
        jPanel1.add(btnSair);
        btnSair.setBounds(110, 30, 53, 23);

        jLabel1.setText("Raio");
        jPanel1.add(jLabel1);
        jLabel1.setBounds(10, 10, 21, 14);

        org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, this, org.jdesktop.beansbinding.ELProperty.create("${circulo.raio}"), txtRaio, org.jdesktop.beansbinding.BeanProperty.create("text"));
        bindingGroup.addBinding(binding);

        jPanel1.add(txtRaio);
        txtRaio.setBounds(40, 10, 140, 20);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 198, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 67, Short.MAX_VALUE)
        );

        bindingGroup.bind();

        pack();
    }// </editor-fold>
    // Variables declaration - do not modify
    private javax.swing.JButton btnCalcular;
    private javax.swing.JButton btnSair;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField txtRaio;
    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
    // End of variables declaration

}
Onde faço um binding com o textfield. e aqui tenho a classe Area
public class AreaCirculoView extends javax.swing.JFrame implements Observer {

    private Circulo circulo;
    
    /** Creates new form AreaCirculoView */
    public AreaCirculoView(Circulo circulo) {
        this.circulo = circulo;
        this.circulo.addObserver(this);
        this.update(this.circulo, null);
        initComponents();
    }

    public Circulo getCirculo() {
        return circulo;
    }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setLayout(null);

        jLabel1.setText("Área");
        jPanel1.add(jLabel1);
        jLabel1.setBounds(10, 11, 23, 14);
        jPanel1.add(jTextField1);
        jTextField1.setBounds(40, 10, 160, 20);

        jButton1.setText("Valor");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jPanel1.add(jButton1);
        jButton1.setBounds(130, 30, 59, 23);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 219, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 64, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
       System.out.println(this.circulo.getArea());
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration

    @Override
    public void update(Observable o, Object arg) {
        this.circulo.setArea(circulo.calculaArea());
//        jTextField1.setText(String.valueOf(circulo.getArea()));
    }
public class Teste {

    public static void main(String[] args) {

        RaioCirculoView raioView = new RaioCirculoView();
        AreaCirculoView areaView = new AreaCirculoView(raioView.getCirculo());
        
        raioView.setVisible(true);
        areaView.setVisible(true);
    }
}
mas ao executar esse teste da a seguinte exception
Exception in thread "main" java.lang.StackOverflowError
	at java.util.Arrays.copyOf(Arrays.java:2734)
	at java.util.Vector.toArray(Vector.java:643)
	at java.util.Observable.notifyObservers(Observable.java:137)
	at java.util.Observable.notifyObservers(Observable.java:98)
	at teste.Circulo.setArea(Circulo.java:35)
	at view.AreaCirculoView.update(AreaCirculoView.java:94)
	at java.util.Observable.notifyObservers(Observable.java:142)
	at java.util.Observable.notifyObservers(Observable.java:98)
	at teste.Circulo.setArea(Circulo.java:35)
	at view.AreaCirculoView.update(AreaCirculoView.java:94)

gostaria que ao informar um valor no campo raio, disparace por Observer a view Area e mostrace o valor no campo area

Criado 7 de dezembro de 2011
Respostas 0
Participantes 1