通过我正在构建的一些应用程序,我可以使用生成动态表单来填充任意变量列表的能力。例如,当运行读取任意文件格式的 Lua 脚本时,脚本可能需要唯一信息来解码该格式(例如,CSV 的分隔字符)。本质上,我想要类似于Unity的检查器的东西。
我有一个HashMap将 a 映射Class到 a 的Handler:
private interface Handler {
Control handle(GridPane grid, Integer row);
}
private static final HashMap<Class, Handler> FormInputs =
new HashMap<Class, Handler>() {
{
// String
put(String.class, (grid, row) -> CreateStringInput(grid, row));
// Integer
put(int.class, (grid, row) -> CreateIntegerInput(grid, row));
put(Integer.class, (grid, row) -> CreateIntegerInput(grid, row));
// Float
put(float.class, (grid, row) -> CreateFloatInput(grid, row));
// Directory
put(Path.class, (grid, row) -> CreateFileInput(grid, row));
put(File.class, (grid, row) -> CreateFileInput(grid, row));
}
};
创建表单时,它用于getFields()从传递的 中获取字段列表Class,并在构造表单时创建一个简单的GridPane并用标签和控件填充它。
从理论上讲,这应该可以正常工作,但我注意到Path该类并不总是符合其预期用途。APath可能指向一个文件或一个目录,这需要不同的浏览对话框设置。同样,aString可用于任意数量的事物,并且可能需要某些验证。
覆盖类型检查并明确说明要使用哪个表单输入的最友好方法是什么?我研究过使用装饰器,但这些似乎是为了扩展装饰对象的现有功能,而我想为它们注入额外的信息。
编辑:对于进一步的上下文,我希望能够执行诸如 Unity 的 [Range()] 装饰器之类的操作,由此数字类由最小值和最大值之间的滑块表示。
编辑2:澄清和简化:Form类生成基于类的自动表单。例如,将它传递给以下类
public class TestClass {
public boolean bool1;
public Boolean bool2;
public String string1;
public String string2;
public Integer int1;
public int int2;
public Path path1;
public File file1;
}
结果如下:
我希望能够在课堂上指出哪些字段应该以不同的方式处理。理想情况下,我还希望通过传入一组混合变量来实现这一点,并且我希望能够定义自定义架构,就像可以使用 Unity 和自定义检查器一样。
慕莱坞森
相关分类