fxml自定义标签(Builder和BuilderFactory)
通用的Person实体类
@Data @AllArgsConstructor @NoArgsConstructor @ToString public class Person { private String name; private int age; }
第一种方式,普通对象
Builder类
/** * 必须要有getter和setter方法,否则生成对象会报空指针 */ @Getter @Setter public class PersonBuilder implements Builder<Person> { private String name; private int age; @Override public Person build() { System.out.println("build"); return new Person(name, age); } }
BuilderFactory类
public class PersonBuilderFactory implements BuilderFactory { private final JavaFXBuilderFactory javaFXBuilderFactory = new JavaFXBuilderFactory(); @Override public Builder<?> getBuilder(Class<?> type) { if (type == Person.class) { System.out.println("返回Builder"); return new PersonBuilder(); } return javaFXBuilderFactory.getBuilder(type); } }
fxml
<?xml version="1.0" encoding="UTF-8"?> <?import java.util.ArrayList?> <?import com.reine.entity.Person?> <ArrayList> <Person name="张三" age="18"/> <Person name="李四" age="19"/> <Person name="王五" age="17"/> </ArrayList>
获取数据
public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { FXMLLoader fxmlLoader = new FXMLLoader(); fxmlLoader.setLocation(fxmlLoader.getClassLoader().getResource("fxml/data.fxml")); fxmlLoader.setBuilderFactory(new PersonBuilderFactory()); ArrayList<Person> root = fxmlLoader.load(); System.out.println("root = " + root); Platform.exit(); } }
第二种方式,Map对象
Builder类
public class PersonBuilderMap extends HashMap<String, Object> implements Builder<Person> { private String name; private int age; @Override public Object put(String key, Object value) { System.out.println("Map-put:(" + key + "," + value + ")"); switch (key) { case "name": this.name = String.valueOf(value); break; case "age": this.age = Integer.parseInt(String.valueOf(value)); break; default: } return super.put(key, value); } @Override public Person build() { System.out.println("build"); return new Person(name, age); } }
BuilderFactory类
public class PersonBuilderFactoryMap implements BuilderFactory { private final JavaFXBuilderFactory javaFXBuilderFactory = new JavaFXBuilderFactory(); @Override public Builder<?> getBuilder(Class<?> type) { if (type == Person.class) { System.out.println("返回Builder"); return new PersonBuilderMap(); } return javaFXBuilderFactory.getBuilder(type); } }
fxml
<?xml version="1.0" encoding="UTF-8"?> <?import java.util.ArrayList?> <?import com.reine.entity.Person?> <ArrayList> <Person name="张三" age="18"/> <Person name="李四" age="19"/> <Person name="王五" age="17"/> </ArrayList>
获取数据
public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { FXMLLoader fxmlLoader = new FXMLLoader(); fxmlLoader.setLocation(fxmlLoader.getClassLoader().getResource("fxml/data.fxml")); fxmlLoader.setBuilderFactory(new PersonBuilderFactoryMap()); ArrayList<Person> root = fxmlLoader.load(); System.out.println("root = " + root); Platform.exit(); } }