Reference your controller from FXML using it's fully qualified name:
fx:controller="d1example2.UserInterfaceController"
Answers to follow-up questions
Answers to the following questions explain why this is so, but you don't necessarily need to understand why if you don't want to, the following is purely informational.
Why must it be fully qualified when he has an import statement?
The imports in the FXML file are not searched when resolving the FXML controller class. The controller class type is found via the class loader (I determined this by reading the JavaFX FXMLLoader source code). The class loader requires a fully qualified name (specifically, a binary name as per the Java language specification).
Once the type is found, if no controller factory has been specified for the fxml loading, then the FXMLLoader will instantiate the controller itself using reflection, otherwise it will delegate that job to an appropriate controller factory (e.g. a controller factory that associates a controller instance based upon Spring dependency injection) but even in that instance, the appropriate type must be found and determined by the FXMLLoader first and to do that it requires a fully qualified classname for the controller.
What's the point of import statements if I need to do that anyway?
The import statements are used for resolving the Java types corresponding to the FXML elements in the document. That way, the document can contain the line:
<?import javafx.scene.layout.*?>
And you can just reference GridPane instead of javafx.scene.layout.GridPane, when you want to define a new GridPane in your FXML.
<GridPane alignment="center" ...>
Yes, potentially, the FXMLLoader could have been coded to also resolve controller classes in the same manner, but it just hasn't been written that way at the time that this answer was written.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…