sfxcode / sapphire-core

Scala - JavaFX Application Framework (CDI, Binding, Expressions)
https://sfxcode.github.io/sapphire-javafx
Apache License 2.0
8 stars 1 forks source link

Keybindings on case class with option val #30

Open ASchmidt84 opened 4 years ago

ASchmidt84 commented 4 years ago

Hi,

I have a little problem and I missing an example for that.

I have a case class like this:

case class PatientView(number: String,
                       personalData: PersonalData,
                       postalAddress: Option[PostalAddress])

case class PostalAddress(addressLine1: String,
                         addressLine2: Option[String],
                         streetLine: String,
                         postalCode: String,
                         city: String,
                         state: Option[String],
                         countryLine: Option[Country])

And a Textfield and a binding like this:

patientAdapter.addBinding(streetField.text,"${_self.postalAddress().addressLine1()}")

this will lead in an exception! Of course it is None. When I add a StringConverter like this

val conv = StringConverter.toStringConverter[PatientView](r => "OKAY")
    patientAdapter.addBinding(streetField.text,"${_self.postalAddress()}",Some(conv))

will lead in an exception like this

class java.lang.String cannot be cast to class de.hp.patient.api.adt.PatientView (java.lang.String is in module java.base of loader 'bootstrap'; de.hp.patient.api.adt.PatientView is in unnamed module of loader 'app')

How I can access an none and also set an Some on change?

sfxcode commented 4 years ago

Hi, first of all usage of the Expression Language should be only used for reading values. There for if the expression lead to an exception, there will be a problem. A solution can be a NULL safe method on your PatientView. My personal workaround when using optional class data to edit is to use two adapters, with the dependent view is only shown, when there is an address in your case. The Framework does not create a new PostalAddress if you use a binding path for an optional value of None.

Hope this help,

Greetings Tom

ASchmidt84 commented 4 years ago

Hi Tom, okay understand. I will create special classes without none. 👍

Another question. If I using a combobox for (example) Countries. How I can use BeanAdapter?

Thank you