Giter Club home page Giter Club logo

sapphire-core's Introduction

DEPRECATED

This project is not maintained anymore and superseeded by sapphire-javafx.

sapphire-javafx

Upgrade sapphire-core 2.0.x to sapphire-javafx 1.*

  • replace sapphire.core with sapphire.javafx
  • data handling is extracted to a new project: sapphire-data
  • CDI, ScalaFX usages please follow the exampes in the sapphire-java demo applications

sapphire-core's People

Contributors

sfxcode avatar tomlamers avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

Forkers

swhgoon

sapphire-core's Issues

i18n better integration

Hi Tom,
I have an idea for better integration of i18n. The resource is loaded in the controller. That is fine. The key could contain variable placeholders. So MessageFormat can used. But I think it is redundant to use that. I suggest this additional class:

class Messages(bundle: ResourceBundle) {

  def getString(key: String, params: AnyRef*): String = {
    Try(bundle.getString(key)).map{f ⇒
      MessageFormat.format(f,params:_*)
    }.getOrElse(s"!!--$key--!!")
  }

}

and a method in ViewController

private lazy val msg: Messages = new Messages(resources)

  def i18n(key: String, params: AnyRef*): String = {
    msg.getString(key,params)
  }

So it is a little bit easier to translate.

Make Controller Loading by CDI optional possible

Different kind of DocumentLoader and Controller Injection should be possible.

  • DocumentLoader can be set in ApplicationEnvironment
  • Provide default without CDI
  • Show optional usage of Deltaspike CDI in the Issues example

UnsatisfiedResolutionException

Hi,
I try to use your module.
I have a Application object which extends from FXApp

My ApplicationController extends DefaultWindowController at applicationDidLaunch I replace the scene content with my LoginController

lazy val loginController: LoginController = getController[LoginController](/*"/fxml/login/Login.fxml"*/)

And now here is my problem. My gui is a subproject in sbt. I have a directory in resources with fxml/login and inside is Login.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.TextFlow?>

<HBox alignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="800.0" prefWidth="1280.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.login.LoginController">
   <children>
      <GridPane alignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" HBox.hgrow="NEVER">
        <columnConstraints>
          <ColumnConstraints hgrow="ALWAYS" minWidth="10.0" />
          <ColumnConstraints hgrow="ALWAYS" minWidth="10.0" />
        </columnConstraints>
        <rowConstraints>
            <RowConstraints fillHeight="false" minHeight="10.0" />
          <RowConstraints minHeight="10.0" vgrow="NEVER" />
          <RowConstraints minHeight="10.0" vgrow="NEVER" />
            <RowConstraints minHeight="10.0" vgrow="NEVER" />
          <RowConstraints minHeight="10.0" vgrow="NEVER" />
        </rowConstraints>
         <children>
            <Label text="%login.card" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1">
               <GridPane.margin>
                  <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
               </GridPane.margin>
            </Label>
            <Label text="%login.password" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2">
               <GridPane.margin>
                  <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
               </GridPane.margin>
            </Label>
            <PasswordField fx:id="cardField" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1">
               <GridPane.margin>
                  <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
               </GridPane.margin>
            </PasswordField>
            <PasswordField fx:id="passwordField" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2">
               <GridPane.margin>
                  <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
               </GridPane.margin>
            </PasswordField>
            <HBox alignment="CENTER" spacing="15.0" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.rowIndex="4" GridPane.valignment="CENTER">
               <children>
                  <Button mnemonicParsing="false" text="%login.login">
                     <graphic>
                        <ImageView fitHeight="64.0" fitWidth="64.0" pickOnBounds="true" preserveRatio="true">
                           <image>
                              <Image url="@../../img/debug_start.png" />
                           </image>
                        </ImageView>
                     </graphic></Button>
                  <Button mnemonicParsing="false" text="%login.reset">
                     <graphic>
                        <ImageView fitHeight="64.0" fitWidth="64.0" pickOnBounds="true" preserveRatio="true">
                           <image>
                              <Image url="@../../img/trash_bin.png" />
                           </image>
                        </ImageView>
                     </graphic></Button>
                  <Button mnemonicParsing="false" onAction="#quitAvalon" text="%login.cancel">
                     <graphic>
                        <ImageView fitHeight="64.0" fitWidth="64.0" pickOnBounds="true" preserveRatio="true">
                           <image>
                              <Image url="@../../img/close_window.png" />
                           </image>
                        </ImageView>
                     </graphic></Button>
               </children>
               <padding>
                  <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
               </padding>
            </HBox>
            <TextFlow fx:id="informationText" textAlignment="CENTER" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
               <padding>
                  <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
               </padding>
            </TextFlow>
            <Label text="%login.screen" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" GridPane.vgrow="NEVER">
               <GridPane.margin>
                  <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
               </GridPane.margin>
            </Label>
            <ComboBox fx:id="screenCombo" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3">
               <GridPane.margin>
                  <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
               </GridPane.margin>
            </ComboBox>
         </children>
      </GridPane>
   </children>
</HBox>

My LoginController looks like this:

package controller.login

import com.sfxcode.sapphire.core.controller.ViewController
import com.sfxcode.sapphire.core.fxml.FxmlLoader
import com.sfxcode.sapphire.core.scene.ContentManager
import com.sfxcode.sapphire.core.value.{BeanConversions, FXBeanAdapter, KeyBindings}
import com.typesafe.scalalogging.LazyLogging
import controller.startUp.ApplicationController
import javafx.fxml.FXML
import javax.enterprise.context.ApplicationScoped
import scalafx.application.Platform
import scalafx.scene.control.ComboBox
import scalafx.scene.text.Text

@FxmlLoader(path = "/fxml/login/Login.fxml")
class LoginController extends ViewController with BeanConversions with LazyLogging {
  import scalafx.Includes._

  private val moduleMap = Map(
    "Lager" → "storageManagement",
    "Operator Ansicht" → "operatorView",
    "Mitarbeiter-Konfiguration" → "workerManagement"
  )

  @FXML
  var screenCombo: javafx.scene.control.ComboBox[String] = _

  @FXML
  var passwordField: javafx.scene.control.PasswordField = _

  @FXML
  var cardField: javafx.scene.control.PasswordField = _

  @FXML
  var informationText: javafx.scene.text.TextFlow = _

  override def didGainVisibilityFirstTime(): Unit = {
    super.didGainVisibilityFirstTime()

    val bindingList = List("cardField","passwordField")
    val bindings = KeyBindings(bindingList)

//    ContentManager()

  }

  override def didGainVisibility() {
    super.didGainVisibility()

    screenCombo.items() ++= moduleMap.values.toSeq
    informationText.getChildren += new Text("Guten Tag 2")
    cardField.requestFocus()
//    errorMessage.setText("")
//    email.setText("[email protected]")
  }

  def applicationController(): ApplicationController = {
    getBean[ApplicationController]()
  }

  /**
    * Beenden der Software in geordneter Reihenfolge
    * @param event
    */
  def quitAvalon(event: javafx.event.ActionEvent): Unit = {
    applicationController().shutdown()
  }

  /**
    * Setzt das Formular wieder zurück
    * @param event
    */
  def resetForm(event: javafx.event.ActionEvent): Unit = {
    cardField.text = ""
    passwordField.text = ""
    screenCombo.selectionModel().clearSelection()
  }

  def login(event: javafx.event.ActionEvent): Unit = {
    //
  }

}

If I start my application I get this error:

Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.IllegalStateException: can not load fxml from path [/fxml/login/Login.fxml]
	at com.sfxcode.sapphire.core.fxml.FxmlHandler.loadFromDocument(FxmlHandler.scala:53)
	at com.sfxcode.sapphire.core.fxml.FxmlHandler$$OwbNormalScopeProxy0.loadFromDocument(com/sfxcode/sapphire/core/fxml/FxmlHandler.java)
	at com.sfxcode.sapphire.core.fxml.FxmlLoading.getController(FxmlLoading.scala:38)
	at com.sfxcode.sapphire.core.fxml.FxmlLoading.getController$(FxmlLoading.scala:34)
	at com.sfxcode.sapphire.core.controller.WindowController.getController(WindowController.scala:20)
	at controller.startUp.ApplicationController.loginController$lzycompute(ApplicationController.scala:93)
	at controller.startUp.ApplicationController.loginController(ApplicationController.scala:93)
	at controller.startUp.ApplicationController.applicationDidLaunch(ApplicationController.scala:104)
	at com.sfxcode.sapphire.core.controller.DefaultWindowController.applicationStartup(DefaultWindowController.scala:21)
	at com.sfxcode.sapphire.core.controller.DefaultWindowController.startup(DefaultWindowController.scala:15)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.apache.webbeans.event.ObserverMethodImpl.invoke(ObserverMethodImpl.java:404)
	at org.apache.webbeans.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:365)
	at org.apache.webbeans.event.NotificationManager.invokeObserverMethod(NotificationManager.java:818)
	at org.apache.webbeans.event.NotificationManager.fireEvent(NotificationManager.java:714)
	at org.apache.webbeans.container.BeanManagerImpl.fireEvent(BeanManagerImpl.java:495)
	at org.apache.webbeans.event.EventImpl.fire(EventImpl.java:83)
	at com.sfxcode.sapphire.core.cdi.ApplicationLauncher.launch(ApplicationLauncher.scala:27)
	at com.sfxcode.sapphire.core.cdi.ApplicationLauncher$$OwbNormalScopeProxy0.launch(com/sfxcode/sapphire/core/cdi/ApplicationLauncher.java)
	at com.sfxcode.sapphire.core.application.FXApplication.start(FXApplication.scala:18)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
	at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
	... 1 more
Caused by: javafx.fxml.LoadException: 
/media/andre/DevelopmentSSD/scala/avalon/gui/target/scala-2.12/classes/fxml/login/Login.fxml:34

	at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
	at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2450)
	at com.sfxcode.sapphire.core.fxml.FxmlHandler.loadFromDocument(FxmlHandler.scala:43)
	... 31 more
Caused by: javax.enterprise.inject.UnsatisfiedResolutionException: Api type [controller.login.LoginController] is not found with the qualifiers 
Qualifiers: [@javax.enterprise.inject.Default()]
for injection into Field Injection Point, field name :  instance, Bean Owner : [FXMLLoaderProvider, WebBeansType:MANAGED, Name:null, API Types:[java.lang.Object,com.sfxcode.sapphire.core.cdi.provider.FXMLLoaderProvider], Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any]]
	at org.apache.webbeans.util.InjectionExceptionUtil.throwUnsatisfiedResolutionException(InjectionExceptionUtil.java:60)
	at org.apache.webbeans.inject.instance.InstanceImpl.get(InstanceImpl.java:132)
	at com.sfxcode.sapphire.core.cdi.provider.FXMLLoaderProvider.$anonfun$createLoader$1(FXMLLoaderProvider.scala:20)
	at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:938)
	at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)
	at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
	at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
	at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
	... 33 more

Process finished with exit code 1

If I add @ApplicationScoped to my LoginController my gui starts.
BUT!! all @FXML inside my controllers are null.

How to use this alongside @sfxml macro?

Hi, I found this framework yesterday and I really like it. But is there a way to make it work with the @sfxml macro? If I annotate a ViewController with sfxml, I can no longer do getControllerclassName on it.

The only place I could find sfxml used in this project is this -
#2

Thanks for your help

Access the viewController right away in Fxml wrapper

It seems that I can't access my view controller right away in the Fxml wrapper class

class ParametersController extends ViewController {

    val validationSupport = new ValidationSupport()

    def ui = fxml.asInstanceOf[ParametersFxml]

    override def didGainVisibility() {
        super.didGainVisibility()
        //println(ApplicationEnvironment.controllerMap)
    }

    def actionCancel() {
        applicationController.showDashboard()
    }

    def actionSave() {
        applicationController.showDashboard()
    }

    def registerValidatorForId[T](validator: Validator[T], fxid: String, parent: Node = null, required:Boolean = false) {
    val node = locateInternal(fxid, parent)
    registerValidator(validator, node, required)
  }

  def registerValidator[T](validator: Validator[T], node: Option[Node], required:Boolean = false) {
    node.foreach(c => {
      validationSupport.registerValidator(c.asInstanceOf[Control], required, validator)
    })
  }


    def applicationController():ApplicationController = {
    getBean[ApplicationController]()
  }

}

@sfxml
class ParametersFxml(viewController: ParametersController, private val txtBrineQMaxMin: TextField) {
  println(viewController) // prints null
  viewController.registerValidator(Validator.createEmptyValidator("Text is required"), Some(txtBrineQMaxMin.delegate.asInstanceOf[Control]), true)

  def actionSave() {
    viewController.actionCancel() //works fine
  }
}

Any ideas?

Keybindings on case class with option val

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?

Remove CDI by default

After many years of using CDI as core feature i decided to drop the default implementation powered by deltaspike. the benefits are to small at least. There are many dependencies, a more complex setup and a longer startup time. However, if some will use CDI in own projects it can easily be done be creating the ApplicationController as CDI Bean and inject some stuff.

bindBidirectional

Hello Tom,

I have now a combobox with locale. I defined a converter for this combo to display the Countryname. This works fine.
Now I have an adapter for an external object. I set this to the adapter as current element. Field name is countryIsoCode.
Now I want convert the iso code "de" to locale Germany. I set up an converter

bindings.add("countryCombo","headquarter.countryIsoCode")
adapter.addConverter[Locale](
      "countryCombo",
      StringConverter[Locale](e ⇒ {
        println("ARG")
        Try(Locale.forLanguageTag(e)).getOrElse(Locale.CHINA)
      }, i ⇒ i.getCountry )
    )
adapter.addBindings(bindings)

I get now an error NPE. So I looked at FXBeanAdapter:58 whichs bindBidirectional the bean.

protected def bindBidirectional[S](bean: FXBean[T], property: Property[S], beanKey: String) {
    val observable = bean.getProperty(beanKey)
    observable match {
      case beanProperty: Property[_] => property match {
        case stringProperty: StringProperty => bindBidirectionalFromStringProperty(stringProperty, observable, beanKey)
        case p: Property[S] => bindBidirectionalFromProperty[S](p, beanProperty.asInstanceOf[Property[S]])
      }
      case _ =>
    }
  }

I think

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.util.Locale (java.lang.String and java.util.Locale are in module java.base of loader 'bootstrap')
	at scalafx.util.StringConverter$$anon$3.toString(StringConverter.scala:82)
	at scalafx.util.StringConverter$$anon$1.toString(StringConverter.scala:48)
	at javafx.scene.control.skin.ComboBoxListViewSkin.updateDisplayText(ComboBoxListViewSkin.java:458)
	at javafx.scene.control.skin.ComboBoxListViewSkin.updateDisplayNode(ComboBoxListViewSkin.java:357)
	at javafx.scene.control.skin.ComboBoxListViewSkin.getDisplayNode(ComboBoxListViewSkin.java:266)
	at javafx.scene.control.skin.ComboBoxBaseSkin.updateDisplayArea(ComboBoxBaseSkin.java:289)
	at javafx.scene.control.skin.ComboBoxBaseSkin.lambda$new$7(ComboBoxBaseSkin.java:133)
	at java.base/java.util.function.Consumer.lambda$andThen$0(Consumer.java:65)
	at com.sun.javafx.scene.control.LambdaMultiplePropertyChangeListenerHandler.lambda$new$1(LambdaMultiplePropertyChangeListenerHandler.java:49)
	at javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:86)
	at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:360)
	at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
	at javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:106)
	at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:113)
	at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:147)
	at javafx.beans.property.ObjectProperty.setValue(ObjectProperty.java:72)
	at com.sun.javafx.binding.BidirectionalBinding.bind(BidirectionalBinding.java:64)
	at javafx.beans.binding.Bindings.bindBidirectional(Bindings.java:868)
	at javafx.beans.property.ObjectProperty.bindBidirectional(ObjectProperty.java:80)
	at com.sfxcode.sapphire.core.value.FXBeanAdapter.bindBidirectionalFromProperty(FXBeanAdapter.scala:137)
	at com.sfxcode.sapphire.core.value.FXBeanAdapter.bindBidirectional(FXBeanAdapter.scala:114)
	at com.sfxcode.sapphire.core.value.FXBeanAdapter.$anonfun$bindAll$1(FXBeanAdapter.scala:58)
	at com.sfxcode.sapphire.core.value.FXBeanAdapter.$anonfun$bindAll$1$adapted(FXBeanAdapter.scala:58)
	at scala.collection.Iterator.foreach(Iterator.scala:941)
	at scala.collection.Iterator.foreach$(Iterator.scala:941)
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1429)
	at scala.collection.IterableLike.foreach(IterableLike.scala:74)
	at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
	at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
	at com.sfxcode.sapphire.core.value.FXBeanAdapter.bindAll(FXBeanAdapter.scala:58)
	at com.sfxcode.sapphire.core.value.FXBeanAdapter.updateBean(FXBeanAdapter.scala:44)
	at com.sfxcode.sapphire.core.value.FXBeanAdapter.$anonfun$new$1(FXBeanAdapter.scala:21)
	at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:360)
	at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
	at javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:106)
	at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:113)
	at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:147)
	at javafx.beans.property.ObjectProperty.setValue(ObjectProperty.java:72)
	at com.sfxcode.sapphire.core.value.FXBeanAdapter.set(FXBeanAdapter.scala:34)
	at controller.operatorView.view.ManufactorOverviewController.$anonfun$didGainVisibility$11(ManufactorOverviewController.scala:117)
	at controller.operatorView.view.ManufactorOverviewController.$anonfun$didGainVisibility$11$adapted(ManufactorOverviewController.scala:108)
	at scalafx.beans.value.ObservableValue$$anon$1.changed(ObservableValue.scala:116)
	at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:181)
	at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
	at javafx.beans.property.ReadOnlyObjectPropertyBase.fireValueChangedEvent(ReadOnlyObjectPropertyBase.java:74)
	at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:102)
	at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:113)
	at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:147)
	at javafx.scene.control.SelectionModel.setSelectedItem(SelectionModel.java:105)
	at javafx.scene.control.MultipleSelectionModelBase.lambda$new$0(MultipleSelectionModelBase.java:67)
	at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:136)
	at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
	at javafx.beans.property.ReadOnlyIntegerPropertyBase.fireValueChangedEvent(ReadOnlyIntegerPropertyBase.java:72)
	at javafx.beans.property.ReadOnlyIntegerWrapper.fireValueChangedEvent(ReadOnlyIntegerWrapper.java:102)
	at javafx.beans.property.IntegerPropertyBase.markInvalid(IntegerPropertyBase.java:114)
	at javafx.beans.property.IntegerPropertyBase.set(IntegerPropertyBase.java:148)
	at javafx.scene.control.SelectionModel.setSelectedIndex(SelectionModel.java:69)
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.updateSelectedIndex(TableView.java:3008)
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.select(TableView.java:2511)
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.clearAndSelect(TableView.java:2441)
	at javafx.scene.control.TableView$TableViewSelectionModel.clearAndSelect(TableView.java:1965)
	at com.sun.javafx.scene.control.behavior.TableCellBehaviorBase.simpleSelect(TableCellBehaviorBase.java:213)
	at com.sun.javafx.scene.control.behavior.TableCellBehaviorBase.doSelect(TableCellBehaviorBase.java:146)
	at com.sun.javafx.scene.control.behavior.CellBehaviorBase.mousePressed(CellBehaviorBase.java:176)
	at com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
	at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
	at javafx.event.Event.fireEvent(Event.java:198)
	at javafx.scene.Scene$MouseHandler.process(Scene.java:3862)
	at javafx.scene.Scene.processMouseEvent(Scene.java:1849)
	at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2590)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447)
	at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:411)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446)
	at com.sun.glass.ui.View.handleMouseEvent(View.java:556)
	at com.sun.glass.ui.View.notifyMouse(View.java:942)
	at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
	at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
	at java.base/java.lang.Thread.run(Thread.java:835)

FXBeanAdapter does not work

I have a problem. I created the manufactoroverview.fxml and also the controller.
I set up a FXBeanAdapter. And on each change of the selection I set on adapter the new bean. But still no changes. Their should be the textfields setup the content.

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.FlowPane?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.TextFlow?>


<?import com.sfxcode.sapphire.core.control.FXValueFactory?>

<HBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.operatorView.view.ManufactorOverviewController">
   <children>
      <VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" spacing="10.0" HBox.hgrow="ALWAYS">
         <children>
            <FlowPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" VBox.vgrow="ALWAYS">
               <VBox.margin>
                  <Insets left="5.0" right="5.0" top="5.0" />
               </VBox.margin>
               <children>
                  <Label text="Label" />
               </children>
            </FlowPane>
            <TableView fx:id="manufactorTable" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" VBox.vgrow="ALWAYS">
              <columns>
                  <TableColumn fx:id="name" maxWidth="1.7976931348623157E308" prefWidth="250" text="%manufactor.name">
                      <cellValueFactory>
                          <FXValueFactory property="name" />
                      </cellValueFactory>
                  </TableColumn>
                <TableColumn fx:id="internalReferenceCol" maxWidth="1.7976931348623157E308" prefWidth="250" text="%manufactor.reference">
                    <cellValueFactory>
                        <FXValueFactory property="internalReference" />
                    </cellValueFactory>
                </TableColumn>
                  <TableColumn fx:id="country" maxWidth="1.7976931348623157E308" prefWidth="250" text="%manufactor.address.countryIsoCode">
                      <cellValueFactory>
                          <FXValueFactory property="headquarter.countryIsoCode" />
                      </cellValueFactory>
                  </TableColumn>
                  <TableColumn fx:id="state" maxWidth="1.7976931348623157E308" prefWidth="250" text="%manufactor.address.state">
                      <cellValueFactory>
                          <FXValueFactory property="headquarter.place" />
                      </cellValueFactory>
                  </TableColumn>
                  <TableColumn fx:id="zip" maxWidth="1.7976931348623157E308" prefWidth="250" text="%manufactor.address.zip">
                      <cellValueFactory>
                          <FXValueFactory property="headquarter.postalCode" />
                      </cellValueFactory>
                  </TableColumn>
              </columns>
            </TableView>
            <ScrollPane fitToWidth="true" maxWidth="1.7976931348623157E308">
              <content>
                <AnchorPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="0.0" minWidth="0.0">
                     <children>
                        <GridPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                          <columnConstraints>
                            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                              <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                              <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                          </columnConstraints>
                          <rowConstraints>
                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                          </rowConstraints>
                           <children>
                              <TextFlow fx:id="manufactorHeadline" GridPane.columnSpan="4" />
                              <Separator prefWidth="200.0" GridPane.columnSpan="4" GridPane.rowIndex="1" />
                              <Label id="test" text="Label" GridPane.rowIndex="2" />
                              <Label text="Label" GridPane.rowIndex="3" />
                              <Label text="Label" GridPane.rowIndex="4" />
                              <TextField id="internalReference" GridPane.columnIndex="1" GridPane.rowIndex="2" />
                              <TextField GridPane.columnIndex="1" GridPane.rowIndex="3" />
                              <TextField id="title" GridPane.columnIndex="1" GridPane.rowIndex="5" />
                              <TextField fx:id="forenameField" GridPane.columnIndex="1" GridPane.rowIndex="6" />
                              <TextField fx:id="surnameField" GridPane.columnIndex="1" GridPane.rowIndex="7" />
                              <ComboBox fx:id="salutationCombo" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.rowIndex="4" />
                              <TextField fx:id="companyField" GridPane.columnIndex="1" GridPane.rowIndex="8" />
                              <TextField fx:id="streetField" GridPane.columnIndex="1" GridPane.rowIndex="9" />
                              <TextField fx:id="housenumberField" GridPane.columnIndex="1" GridPane.rowIndex="10" />
                           </children>
                        </GridPane>
                     </children>
                  </AnchorPane>
              </content>
            </ScrollPane>
         </children>
      </VBox>
   </children>
</HBox>

The controller



package controller.operatorView.view

import com.sfxcode.sapphire.core.controller.ViewController
import com.sfxcode.sapphire.core.fxml.FxmlLoader
import com.sfxcode.sapphire.core.value.{BeanConversions, FXBean, FXBeanAdapter, KeyBindings}
import controller.utils.FXUtils
import de.scalamat.manufactorManagement.api.manufactor.response.ManufactorApi
import javafx.fxml.FXML
import javax.inject.Inject
import model.rest.ManufactorPortal
import scalafx.application.Platform
import scalafx.collections.ObservableBuffer
import scalafx.scene.control.TableView
import scalafx.scene.text.Text

import scala.util.Try

@FxmlLoader(path = "/fxml/operator/view/manufactoroverview.fxml")
class ManufactorOverviewController extends AbstractViewController with BeanConversions {

  import scalafx.Includes._

  @Inject
  var _dataPortal: ManufactorPortal = _
  def dataPortal = _dataPortal

  @FXML
  private var manufactorHeadline: javafx.scene.text.TextFlow = _

  @FXML
  private var manufactorTable: javafx.scene.control.TableView[FXBean[ManufactorApi]] = _

  private val manufactorBuffer: ObservableBuffer[FXBean[ManufactorApi]] = ObservableBuffer()

  lazy val manufactorAdapter: FXBeanAdapter[ManufactorApi] = FXBeanAdapter[ManufactorApi](this)
  manufactorAdapter.beanProperty.onChange((_, _, e) ⇒ println(e) )

  override def didGainVisibilityFirstTime(): Unit = {
    super.didGainVisibilityFirstTime()

    manufactorTable.items = manufactorBuffer

    println("!!!!!!!!!!!!!!!!!!!!!!!!!!")
    println(this.managedChildren)
    println("!!!!!!!!!!!!!!!!!!!!!!!!!!")

//    manufactorTable.columnResizePolicy = TableView.ConstrainedResizePolicy


    dataPortal.list(Long.MaxValue).map{u ⇒
      manufactorBuffer ++= u
    }.recover{
      case e ⇒ println(e)
    }
    dataPortal.count().map(r ⇒ r)
  }

  override def didGainVisibility(): Unit = {
    super.didGainVisibility()

    val bindingList = List("internalReference","test","title"/*,"country","state","zip"*/)
    val bindings = KeyBindings(bindingList)
//    bindings.add("manufactorHeadline","name")
//    bindings.add("housenumberField","headquarter.houseNumber")
//  bindings.add("internalReference","internalReference")
//    bindings.add("companyField","headquarter.company")
//    bindings.add("streetField","headquarter.street")
//    bindings.add("country","!{_.self.headquarter.countryIsoCode}")

    manufactorAdapter.addBindings(bindings)
    println("------------------------")
    println(bindings.childrenMap)
    println(manufactorAdapter.bindingMap)
    println(manufactorAdapter.guessPropertyForNode("internalReference"))
    println(manufactorAdapter.guessPropertyForNode("title"))
    println("####################")
    val s = FXBeanAdapter[ManufactorApi](this)
    s.addBindings(KeyBindings("test","internalReference"))
    println("s.converterMap " + s.converterMap)
    println(s.bindingMap)


    manufactorTable.selectionModel().selectedItem.onChange((_,_,e) ⇒ {
      if(e == null){
        manufactorAdapter.unset()
        manufactorHeadline.children.clear()
      } else {
        println(e.name)
        manufactorHeadline.children.clear()
        manufactorHeadline.children += new Text(e.name)
        manufactorAdapter.revert()
        manufactorAdapter.set(e)
      }
    })

//    adapter.addBindings(KeyBindings("internalReference","internalReference"))
    println("FERTIG")
  }


}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.