# Binding eines EntityBean als SelectionInList in ComboBox



## chrs (13. Jul 2008)

Hallo,

ich habe folgendes Problem und zwar möchte ich in meinem Projekt die Auswahl einer Kraftstoffart für ein Auto anbieten, der Krafstoff und das Autos sind jeweils Entity Beans, wie binde ich nun die ComboBox so an das Auto das ich bei entsprechender Auswahl den Fueltype angestöpselt bekomme?

*Ich benutze das JGoodies Binding Framework*

Eine kleine Komposition die vielleicht näher erläutert:







Die normalen Bindings klappen selbstverständlich alle wunderbar, mir fehlt einfach die zündende Idee.


Vielen Dank im vorraus

Chris


----------



## kleiner_held (14. Jul 2008)

Ich habe sowas mit Hibernate folgendermaßen gelöst:

```
Car car;
List<Fueltype> types;
JComboBox comboBox; 
BeanAdapter<Car> adapter = new BeanAdapter<Car> (car, true);
Bindings.bind(comboBox, new SelectionInList<Character> (types, adapter.getValueModel("fueltype")));
comboBox.setRenderer(new DefaultListCellRenderer()
        {
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
            {
                return super.getListCellRendererComponent(list, value == null ? null : ((Fueltype) value).getTitle(), index, isSelected, cellHasFocus);
            } 
        });
```

Mit Entity Beans sollte es genauso gehen.


----------



## chrs (15. Jul 2008)

Super antwort, Problem gelöst, vielen Dank.


----------



## chrs (16. Jul 2008)

Ein Problem hab ich nun doch noch, ich ändere ein TextField Inhalt per setText(), wenn ich das tue bekommt aber das Binding davon garnichts mit, tippe ich die Änderung ins Textfeld klappt es, gibt es eine Möglichkeit den Adapter per Hand zu aktualisieren?


----------



## kleiner_held (16. Jul 2008)

Eigentlich sollte auch JTextfeld.setText() automatisch funktionieren.
Bist du dir sicher, dass das Binding richtig ausgefuehrt wurde?

Beispiel:

```
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

import com.jgoodies.binding.adapter.Bindings;
import com.jgoodies.binding.beans.BeanAdapter;
import com.jgoodies.binding.beans.Model;

public class Test
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        final JTextField textField = new JTextField(20);
        JButton button = new JButton(new AbstractAction("Add Suffix")
        {
            public void actionPerformed(ActionEvent e)
            {
                textField.setText(textField.getText() + " Suffix");
            } 
        });
        frame.getContentPane().add(textField, BorderLayout.NORTH);
        frame.getContentPane().add(button, BorderLayout.SOUTH);
        Car car = new Car();
        BeanAdapter<Car> adapter = new BeanAdapter<Car> (car, true);   // Adapter erzeugen
        Bindings.bind(textField, adapter.getValueModel("name"));  // Property ans JTextField binden
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
    
    public static class Car extends Model
    {
        String name = "Name";

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            String oldValue = this.name;
            this.name = name;
            System.out.println("Changed name to: "+name); // Debugausgabe
            firePropertyChange("name", oldValue, name);
        }
    }
}
```


----------



## chrs (16. Jul 2008)

Ich mach es anders, bei deiner Variante weiß ich nicht wie ich ein getriggertes Model bekomme, sehe da aber leider irgendwie keinen Fehler. Vielen Dank


```
// model ist hier das presentation model von meiner view, welcher das model für das databinding hält
ValueModel valueModel = model.getPresentation().getBufferedModel(Car.TITLE);
JTextField textField = BasicComponentFactory.createTextField(valueModel);
```

getPresentation()

```
/** Präsentations Model */
protected PresentationModel<Persistable> presentation;

...

public PresentationModel<Persistable> getPresentation() {
	return this.presentation;
}
```


Car:

```
@Entity
@Table(name = "car")
public class Car extends Model implements Persistable {

	private static final long serialVersionUID = 6365527671160009013L;

	public static final String TITLE = "title";
	private String title;

       [...]

	/** Default Constructor */
	public Car() {
		super();
	}

	public String getTitle() {
		return this.title;
	}

	public void setTitle(String title) {
		this.firePropertyChange(TITLE, this.title, title);
		this.title = title;
	}

        [...]
}
```
[/code]


----------



## kleiner_held (16. Jul 2008)

Ich glaube der Fehler liegt an folgender Stelle:

```
public class Car ...

  public void setTitle(String title) {
      this.firePropertyChange(TITLE, this.title, title);
      this.title = title;
   } 
}
```

Man sollte immer erst das Property aendern und dann erst den Event ausloesen.
Also:


```
public class Car ...

  public void setTitle(String title) {
      String oldTitle = this.title;
      this.title = title;
      this.firePropertyChange(TITLE, oldTitle, title);
   } 
}
```


----------



## chrs (16. Jul 2008)

Es klappt alles solange ich selbst tippe, versuche ich aber etwas mit setText() zu ändern, ändert er das Objekt nicht nach dem Trigger-Commit..


----------

