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
[code]
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);
}
}[/code]
Agora as views
[code]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
}[/code]
Onde faço um binding com o textfield.
e aqui tenho a classe Area
[code]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()));
}[/code]
[code]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);
}
}[/code]
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