Unterschiede
Hier werden die Unterschiede zwischen der gewählten und der aktuellen Version gezeigt.
| eclipse-rcp:binding 2008/05/21 23:14 | eclipse-rcp:binding 2020/09/25 09:41 aktuell | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | [[eclipse-rcp|Eclipse-RCP]] | + | [[eclipse-rcp|Java - Eclipse-RCP]] |
| - | + | ====== Eclipse - Binding (ab Eclipse 3.3) ====== | |
| - | ====== Eclipse - Binding (Eclipse 3.3) ====== | + | JFace-Data-Binding ab Eclipse 3.3\\ |
| - | JFace-Data-Binding Eclipse 3.3\\ | + | |
| \\ | \\ | ||
| In einem gedachten Beispiel soll ein Model aus den drei Attributen\\ | In einem gedachten Beispiel soll ein Model aus den drei Attributen\\ | ||
| Zeile 9: | Zeile 8: | ||
| * Vorname\\ | * Vorname\\ | ||
| * Geburtsdatum\\ | * Geburtsdatum\\ | ||
| - | bestehen. | + | bestehen.\\ |
| + | \\ | ||
| + | <html> | ||
| + | <script type="text/javascript"><!-- | ||
| + | google_ad_client="pub-9681858985507948"; | ||
| + | google_ad_width = 468; | ||
| + | google_ad_height = 60; | ||
| + | google_ad_format = "468x60_as"; | ||
| + | google_ad_type = "text"; | ||
| + | google_ad_channel = ""; | ||
| + | google_color_border = "cccccc"; | ||
| + | google_color_bg = "FFFFFF"; | ||
| + | google_color_link = "1d2d8c"; | ||
| + | google_color_text = "000000"; | ||
| + | google_color_url = "1d2d8c"; | ||
| + | //--> | ||
| + | </script> | ||
| + | <script type="text/javascript" | ||
| + | src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> | ||
| + | </script> | ||
| + | </html> | ||
| + | \\ | ||
| ===== Binding-Methode ===== | ===== Binding-Methode ===== | ||
| - | Die Binding-Methode kann beispielsweise in der MyFormPart-Klasse implementiert werden. | + | Die Binding-Methode kann beispielsweise in der MyFormPart-Klasse implementiert werden.\\ |
| + | \\ | ||
| <code java> | <code java> | ||
| private void bind(model) { | private void bind(model) { | ||
| m_bindingContext = new DataBindingContext(); | m_bindingContext = new DataBindingContext(); | ||
| - | Binding binding; | + | // Das Textfeld "m_lastnameTxt" für den Nachnamen an das Model-Attribut "m_lastname" binden: |
| - | + | m_bindingContext.bindValue(SWTObservables.observeText(m_lastnameTxt, | |
| - | binding = m_bindingContext.bindValue(SWTObservables.observeText(m_lastnameTxt, | + | SWT.Modify), BeansObservables.observeValue(model, MyModel.PROP_LASTNAME), null, null); |
| - | SWT.Modify), BeansObservables.observeValue(model, Model.PROP_LASTNAME), null, null); | + | |
| - | binding = m_bindingContext.bindValue(SWTObservables.observeText(m_firstnameTxt, | + | // Das Textfeld "m_firstnameTxt" für den Nachnamen an das Model-Attribut "m_firstname" binden: |
| - | SWT.Modify), BeansObservables.observeValue(model, Model.PROP_FIRSTNAME), null, null); | + | m_bindingContext.bindValue(SWTObservables.observeText(m_firstnameTxt, |
| + | SWT.Modify), BeansObservables.observeValue(model, MyModel.PROP_FIRSTNAME), null, null); | ||
| + | |||
| + | // Das Textfeld "m_birthdateTxt" für den Nachnamen an das Model-Attribut "m_birthday" binden: | ||
| + | m_bindingContext.bindValue(SWTObservables.observeText(m_birthdateTxt, | ||
| + | SWT.Modify), BeansObservables.observeValue(model, MyModel.PROP_BIRTHDAY), | ||
| + | m_targetToModelStrategy, m_modelToTargetStrategy); | ||
| + | // UpdateStrategy initialisieren (Konverter und Validatoren festlegen): | ||
| initUpdateStrategy(); | initUpdateStrategy(); | ||
| - | binding = m_bindingContext.bindValue(SWTObservables.observeText(m_birthdateTxt, | ||
| - | SWT.Modify), BeansObservables.observeValue(model, IModel.PROP_BIRTHDAY), | ||
| - | m_targetToModelStrategy, m_modelToTargetStrategy); | ||
| } | } | ||
| </code> | </code> | ||
| - | + | \\ | |
| - | Der Aufruf erfolgt dann in der setFormInput(..) Methode: | + | Der Aufruf erfolgt dann in der setFormInput(..) Methode:\\ |
| <code java> | <code java> | ||
| @Override | @Override | ||
| public boolean setFormInput(final Object input){ | public boolean setFormInput(final Object input){ | ||
| - | Model model = (Model)input; | + | MyModel model = (MyModel)input; |
| bind(model); | bind(model); | ||
| } | } | ||
| - | </code> | + | </code>\\ |
| - | + | \\ | |
| - | + | \\ | |
| - | + | \\ | |
| - | + | ||
| ===== Methode initUpdateStrategy() ===== | ===== Methode initUpdateStrategy() ===== | ||
| - | Da diese Methode von der bind()-Methode aufgerufen wird, muss sie natürlich für diese erreichbar sein. | + | Da diese Methode von der bind()-Methode aufgerufen wird, muss sie natürlich für diese erreichbar sein.\\ |
| <code java> | <code java> | ||
| private void initUpdateStrategy(){ | private void initUpdateStrategy(){ | ||
| IConverter date2StrConverter = new IConverter() { | IConverter date2StrConverter = new IConverter() { | ||
| - | public Object convert(Object fromObject) { | + | public Object convert(Object fromObject) { |
| - | assert fromObject instanceof Date; | + | assert fromObject instanceof Date; |
| - | Date date = (Date) fromObject; | + | Date date = (Date) fromObject; |
| - | return DateConv.toLocalizedString(date, false); | + | SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy"); |
| + | return sdf.format(date); | ||
| } | } | ||
| Zeile 72: | Zeile 93: | ||
| assert fromObject instanceof String; | assert fromObject instanceof String; | ||
| String str = (String) fromObject; | String str = (String) fromObject; | ||
| - | return DateConv.toDate(str); | + | SimpleDateFormat sd = new SimpleDateFormat("dd.MM.yyyy"); |
| + | Date date = null; | ||
| + | try { | ||
| + | Date newDate = sd.parse(dateString); | ||
| + | } catch (Exception e) { | ||
| + | e.printstacktrace(); | ||
| + | } | ||
| + | return date; | ||
| } | } | ||
| Zeile 118: | Zeile 146: | ||
| m_modelToTargetUpdateStrategy1 = new UpdateValueStrategy(); | m_modelToTargetUpdateStrategy1 = new UpdateValueStrategy(); | ||
| + | // oder bei spezieller Policy (Default: UpdateValueStrategy.POLICYUPDATE) | ||
| + | // m_modelToTargetUpdateStrategy1 = new UpdateValueStrategy(UpdateValueStrategy.NEVER); | ||
| m_modelToTargetUpdateStrategy1.setConverter(date2StrConverter); | m_modelToTargetUpdateStrategy1.setConverter(date2StrConverter); | ||
| m_targetToModelUpdateStrategy = new UpdateValueStrategy(); | m_targetToModelUpdateStrategy = new UpdateValueStrategy(); | ||
| Zeile 125: | Zeile 155: | ||
| } | } | ||
| </code> | </code> | ||
| - | + | \\ | |
| - | + | \\ | |
| - | + | \\ | |
| ===== Model-Klasse ===== | ===== Model-Klasse ===== | ||
| Zeile 136: | Zeile 165: | ||
| import java.beans.PropertyChangeListener; | import java.beans.PropertyChangeListener; | ||
| - | public class Model implements IModel { | + | public class MyModel { |
| - | String PROP_LASTNAME = "lastname"; //$NON-NLS-1$ | + | String PROP_LASTNAME = "lastname"; |
| - | String PROP_FIRSTNAME = "firstname"; //$NON-NLS-1$ | + | String PROP_FIRSTNAME = "firstname"; |
| - | String PROP_BIRTHDAY = "birthday"; //$NON-NLS-1$ | + | String PROP_BIRTHDAY = "birthday"; |
| private final PropertyChangeSupport m_propertyChangeSupport = new PropertyChangeSupport(); | private final PropertyChangeSupport m_propertyChangeSupport = new PropertyChangeSupport(); | ||
| Zeile 146: | Zeile 175: | ||
| private Date m_birthday; | private Date m_birthday; | ||
| - | public Model(String lastname, String firstname, Date birthday) { | + | public MyModel(String lastname, String firstname, Date birthday) { |
| m_lastname = lastname; | m_lastname = lastname; | ||
| m_firstname = firstname; | m_firstname = firstname; | ||
| Zeile 204: | Zeile 233: | ||
| } | } | ||
| </code> | </code> | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | ===== Button-Enablement an Validationstatus binden ===== | ||
| + | <code java> | ||
| + | public void bindButtonEnablementToValidationStatus(final Button button) { | ||
| - | + | final IObservableValue buttonEnable = SWTObservables.observeEnabled(button); | |
| - | + | final IObservableValue validationStatus = | |
| + | new AggregateValidationStatus(myBindingContext.getValidationRealm(), myBindingContext.getBindings(), AggregateValidationStatus.MAX_SEVERITY); | ||
| + | myBindingContext.bindValue(buttonEnable, | ||
| + | validationStatus, | ||
| + | new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER), | ||
| + | new UpdateValueStrategy().setConverter(new Converter(IStatus.class, Boolean.TYPE) { | ||
| + | @Override | ||
| + | public Object convert(final Object fromObject) { | ||
| + | return new Boolean(((IStatus) fromObject).isOK()); | ||
| + | } | ||
| + | })); | ||
| + | } | ||
| + | </code> | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| ===== Fehlersuche ===== | ===== Fehlersuche ===== | ||
| - | Wird eine setXYZ(..)-Methode nicht gefunden, so sollte als Erstes die Schreibweise der Property-Konstanten (hier: PROP_XXXXX) überprüft werden. Diese muss genauso geschrieben werden wie die get und set-Methoden. Lediglich das get und set wird weggelassen und der erste Buchstabe wird kleingeschrieben. | + | Wird eine setXYZ(..)-Methode nicht gefunden, so sollte als Erstes die Schreibweise der Property-Konstanten (hier: PROP_XXXXX) überprüft werden. Diese muss genauso geschrieben werden wie die get und set-Methoden. Lediglich das get und set wird weggelassen und der erste Buchstabe wird kleingeschrieben.\\ |
| - | Beispiel: | + | Beispiel:\\ |
| es gäbe die Methoden getValue() und setValue(int newValue), so müsste die Konstante als "value" definiert werden.\\ | es gäbe die Methoden getValue() und setValue(int newValue), so müsste die Konstante als "value" definiert werden.\\ | ||
| - | Beispiel: | + | Beispiel:\\ |
| - | <code java>PROP_VALUE = "value";</code> | + | <code java>public static final String PROP_VALUE = "value";</code>\\ |
| Als Zweites kann man einen Breakpoint in der Methode ValueBinding#doUpdate(..) setzen (z.B. beim Aufruf der Methode updateValueStrategy.doSet(..)) um den Fehler zu finden.\\ | Als Zweites kann man einen Breakpoint in der Methode ValueBinding#doUpdate(..) setzen (z.B. beim Aufruf der Methode updateValueStrategy.doSet(..)) um den Fehler zu finden.\\ | ||
| - | Achtung! In Eclipse 3.3 gibt es einen Fehler: Die PropertyMethode/die Property-Konstante darf niemals mit zwei Großbuchstaben beginnen (also nicht: getVAlue() mit "vAlue")!! | + | Achtung! In Eclipse 3.3 gibt es einen Fehler: Die PropertyMethode/die Property-Konstante darf niemals mit zwei Großbuchstaben beginnen (also nicht: getVAlue() mit "vAlue")!!\\ |