java - 基于类型生成表单元素,并带有覆盖
问题描述
通过我正在构建的一些应用程序,我可以使用生成动态表单的能力来填写任意变量列表。例如,当运行以任意文件格式读取的 Lua 脚本时,脚本可能需要唯一信息来解码该格式(例如 CSV 的分隔字符)。本质上,我想要类似于Unity的检查器的东西。
我有 aHashMap
将 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 和自定义检查器一样。
解决方案
我想出的最好的方法涉及一些重新排列。它仅适用于自定义类,但它允许在初始化后进行一些自定义。
首先,为要实现的自定义类编写一个公共接口,允许它们定义自定义控件列表:
public interface FormLayout {
List<Input> getLayout();
}
然后,在构造函数中,检查对象是否定义了自己的布局,而不是初始化字段列表:
public Form (Object objRef) {
Field[] fields = objRef.getClass().getFields();
if(objRef instanceof Form.FormLayout) {
inputs = ((FormLayout) objRef).getLayout();
}
else {
inputs = new ArrayList<>();
for (int i = 0; i < fields.length; i++) {
inputs.add(new Input(fields[i].getName(), FormInputs.get(fields[i].getType())));
}
}
}
现在您有了一个可以在构造表单之前操作的已定义输入列表,并且能够为类定义自定义布局。
需要做进一步的工作来处理将输入与字段相关联,以便用户输入实际上进入正确的变量,但这似乎是最合理的方法。
推荐阅读
- tampermonkey - Tampermonkey 删除特定内容
- android - 我如何将 youtube 播放器视频视图添加到布局中?
- python - 在 Graphene python 解析器中调用自定义方法
- java - 如何按列对 JTable 进行排序?
- android - 颤振错误:ErrorDioError [DioErrorType.RESPONSE]:Http 状态错误 [400]
- reactjs - 为什么这个“无法更新未安装的组件”修复工作?
- notifications - 使用发出的警报中的团队名称将协调失败警报动态路由到适当的团队松弛通道
- server - 当字段已经填写在父解析器中时,如何避免调用 Apollo Server 的嵌套解析器?
- python - 无法将 QMenu 项目中的“已检查”状态和自定义参数传递给连接的插槽
- java - 如何抑制空手道失败的功能日志