JavaFX8 list bindings similar to xaml

匿名 (未验证) 提交于 2019-12-03 01:20:02

问题:

I am unable to bind in fxml a collection to a customized template. Here the code how I would do it in xaml:

                       

Here the Model:

class Person {     String FirstName, LastName;     String[] MiddleNames; } 

And the Layout would look similar to this:

John Ivy Robert Downey Junior Max more middlenames in fact even thousands are possible lastname 

Is the binding of an oberservable collection to a customized template possible? I tried the cellfactory but couldnt get my head wrapped around it, as everybody used only strings.

回答1:

I am not 100% sure this is the answer to your question as I am totally unfamiliar with xaml, but hopefully it is...

Sample Implementation

The sample works by setting the model object (the Person) into the namespace of the FXML loader, which allows you to use a binding expression in FXML to bind to properties of the object.

In the sample, there are a few names initially in the model and you can modify the bound list in the model using the add and remove buttons to add or remove a few more canned names in the list.

All code goes in a package named sample.names.

name-display.fxml

                        

NameDisplayApp.java

import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.stage.Stage;  import java.io.IOException;  public class NameDisplayApp extends Application {      @Override     public void start(Stage stage) throws IOException {         Person person = new Person(                 "Bruce",                 new String[] { "Simon", "Larry" },                 "Banner"         );          FXMLLoader loader = new FXMLLoader(                 getClass().getResource(                         "name-display.fxml"                 )         );         loader.getNamespace().put(                 "person",                 person         );         Pane pane = loader.load();          NameDisplayController controller = loader.getController();         controller.setPerson(person);          stage.setScene(new Scene(pane));         stage.show();     }      public static void main(String[] args) {         launch(args);     } } 

NameDisplayController.java

import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent;  public class NameDisplayController {     private Person person;      private ObservableList sampleNames = FXCollections.observableArrayList(             "George", "Henry", "Wallace"     );      public void setPerson(Person person) {         this.person = person;     }      public void addName(ActionEvent actionEvent) {         if (!sampleNames.isEmpty()) {             person.getMiddleNames().add(                 sampleNames.remove(0)             );         }     }      public void removeName(ActionEvent actionEvent) {         if (!person.getMiddleNames().isEmpty()) {             sampleNames.add(                     person.getMiddleNames().remove(0)             );         }     } } 

Person.java

import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList;  public class Person {     public StringProperty firstName;     public StringProperty lastName;      private ObservableList middleNames;      public Person(String firstName, String[] middleNames, String lastName) {         this.firstName   = new SimpleStringProperty(firstName);         this.middleNames = FXCollections.observableArrayList(middleNames);         this.lastName    = new SimpleStringProperty(lastName);     }      public String getFirstName() {         return firstName.get();     }      public StringProperty firstNameProperty() {         return firstName;     }      public void setFirstName(String firstName) {         this.firstName.set(firstName);     }      public ObservableList getMiddleNames() {         return middleNames;     }      public String getLastName() {         return lastName.get();     }      public StringProperty lastNameProperty() {         return lastName;     }      public void setLastName(String lastName) {         this.lastName.set(lastName);     } } 

Alternate Implementations

There may be other (perhaps more preferred ways) of doing this - e.g. by associating bindings of items in code rather than FXML (which is what I usually do) or injecting the model using a dependency injection system. See afterburner.fx for an example of the injection approach - though I don't know if afterburner also places model objects into the FXML namespace or just injects into the controller (if it doesn't do the injection into the FXML namespace that might be a cool addition you could request for it).



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!