为了账号安全,请及时绑定邮箱和手机立即绑定

根据类型生成表单元素,具有覆盖

根据类型生成表单元素,具有覆盖

Smart猫小萌 2021-11-17 17:15:45
通过我正在构建的一些应用程序,我可以使用生成动态表单来填充任意变量列表的能力。例如,当运行读取任意文件格式的 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 和自定义检查器一样。
查看完整描述

1 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我想出的最好方法涉及一些重新排列。它只对自定义类自动工作,但它允许在初始化后进行一些自定义。


首先,为要实现的自定义类编写一个公共接口,允许它们定义自定义控件列表:


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())));

        }

    }

}

现在您有一个定义的输入列表,可以在构建表单之前对其进行操作,并且能够为类定义自定义布局。


需要做进一步的工作来处理将输入与字段相关联,以便用户输入实际进入正确的变量,但这似乎是最合理的方法。


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信