在 Java 中制作带有注释的自定义表单
Make custom forms with annotations in Java
我正在尝试制作带有注释的自定义表单。我的想法是,给定一个带注释的 class,我的代码可以生成一个 FX GUI 表单来编辑那个 class 的对象。代码里应该更清楚:
@...
@interface Form {
String label() default "";
}
@Form
class SomeData {
@Form(label="Name")
String name;
@Form(label="Age")
int age;
...
}
class FormBuilder {
Pane makeForm(Class annotated) {
Pane pane = ... ;
for (/*each annotated field*/) {
Label label = new Label(/*field's annotated label*/));
Control field = generateControl(/*annotated field's type*/));
...
pane.getChildren().addAll(label, field);
}
return pane;
}
Control generateControl(Class type) {
// returns the control that matches with the type
// its everything OK here
}
main(...) {
Pane someDataForm = makeForm(SomeData.class);
...
}
}
我现在开始使用自定义注释,但还不知道如何:
- 遍历带注释的 class
的带注释字段
- 获取其标注数据(label:String)
- 获取注释字段的类型(名称:String 和年龄:Integer 在这种情况下)
为了实现方法makeForm
在我们讨论反射代码之前,我认为您将需要另一个注释来表示您的 class 表示自定义表单的元素。您当前的 @Form
注释更适合字段级别,因为它代表每个表单字段的标签。我会将其重命名为 @FormField
。然后,您的 @Form
注释只能用于告诉反射 API 哪些 class 是自定义表单。
现在,开始编写代码。首先,您需要在应用程序中初始化反射。该包将是您要在应用中使用反射的第一个包。
private static Reflections reflections = new Reflections("your.java.package");
要让每个 class 都带有您的 @Form
注释,您可以使用:
Set<Class<? extends Forms>> customForms = reflections.getTypesAnnotatedWith(Form.class)
现在,您可以遍历每个自定义表单,并解析每个字段的注释:
// Loop through every class with Form annotation
for (Class<? extends Forms> form : customForms) {
for (Field field : form.getDeclaredFields()) {
// Check each field, if it has your FormField attribute, you can then access the annotation methods
if (field.isAnnotationPresent(FormField.class)) {
Label label = new Label(field.getAnnotation(FormField.class).label());
// Do additional stuff to build your form
}
}
}
我正在尝试制作带有注释的自定义表单。我的想法是,给定一个带注释的 class,我的代码可以生成一个 FX GUI 表单来编辑那个 class 的对象。代码里应该更清楚:
@...
@interface Form {
String label() default "";
}
@Form
class SomeData {
@Form(label="Name")
String name;
@Form(label="Age")
int age;
...
}
class FormBuilder {
Pane makeForm(Class annotated) {
Pane pane = ... ;
for (/*each annotated field*/) {
Label label = new Label(/*field's annotated label*/));
Control field = generateControl(/*annotated field's type*/));
...
pane.getChildren().addAll(label, field);
}
return pane;
}
Control generateControl(Class type) {
// returns the control that matches with the type
// its everything OK here
}
main(...) {
Pane someDataForm = makeForm(SomeData.class);
...
}
}
我现在开始使用自定义注释,但还不知道如何:
- 遍历带注释的 class 的带注释字段
- 获取其标注数据(label:String)
- 获取注释字段的类型(名称:String 和年龄:Integer 在这种情况下)
为了实现方法makeForm
在我们讨论反射代码之前,我认为您将需要另一个注释来表示您的 class 表示自定义表单的元素。您当前的 @Form
注释更适合字段级别,因为它代表每个表单字段的标签。我会将其重命名为 @FormField
。然后,您的 @Form
注释只能用于告诉反射 API 哪些 class 是自定义表单。
现在,开始编写代码。首先,您需要在应用程序中初始化反射。该包将是您要在应用中使用反射的第一个包。
private static Reflections reflections = new Reflections("your.java.package");
要让每个 class 都带有您的 @Form
注释,您可以使用:
Set<Class<? extends Forms>> customForms = reflections.getTypesAnnotatedWith(Form.class)
现在,您可以遍历每个自定义表单,并解析每个字段的注释:
// Loop through every class with Form annotation
for (Class<? extends Forms> form : customForms) {
for (Field field : form.getDeclaredFields()) {
// Check each field, if it has your FormField attribute, you can then access the annotation methods
if (field.isAnnotationPresent(FormField.class)) {
Label label = new Label(field.getAnnotation(FormField.class).label());
// Do additional stuff to build your form
}
}
}