Java:如何处理我的应用程序插件中的自定义设置?

Luk*_*ale 5 java settings plugins swing

我目前正在开发一个从其他设备接收命令的应用程序.我将提供一个接口,让其他人开发自己的传入命令的解释(插件).其他人开发的每个插件都可以具有需要由用户提供的任何自定义设置.

例如,名为"KeyboardPlugin"的插件可以支持设置以设置按键之间的延迟,但也显示要按下的所有支持键的列表.另一个插件可以是例如称为"MouseMovePlugin",其中用户可以选择鼠标的准确度及其速度.

现在我的问题是,每个插件的设置需要是1.在UI中显示,2.在用户选择设置之后,必须将它们解析回插件以让插件知道用户选择了什么.

我正在使用Java,而UI是在Swing中开发的.有一个选项面板,显示与插件没有直接关系的选项,如常用选项.但是在同一个面板上,我想显示插件提供的设置.

插件设置如下所示:

  • a)"请输入两次按键之间的延迟 - > [带有Int作为输入的文本框](最小1;最大500)
  • b)"bla bla - > [Checkbox](带布尔值)"
  • c)"Bla bla 2 - > [Textbox](字符串值作为输入;与设置b有关!)
  • d)"选择按钮"["a","b","c"]

如您所见,插件设置可以是例如int,boolean,string,但也可以是示例d,数组或枚举.我现在的问题是,我该如何处理?每个插件都可以有一组设置类型,这些设置类型也可以相互依赖,例如c取决于用户对b的选择.

1)首先,我需要一种技术来询问插件的设置,好吧,我可以调用插件接口中提供的方法,但它应该返回什么?我的意思是,List可以工作但是设置选项之间没有依赖关系.

2)如何"设置插件中的设置".如果用户选择他/她的首选设置,那么我该如何告诉插件?

到目前为止,我能想到的唯一解决方案如下:一个简单的域特定语言(DSL),如下所示:varName:type(min,max,default)"UI question"作为给定示例:

buttonDelay: boolean(false) "Enable button delay"
if(buttonDelay){
buttonDelayTime: int(1,500,25) "Choose delay between buttons"
}
Run Code Online (Sandbox Code Playgroud)

我会将设置DSL解析为Java树,以便能够进行简单的类型检查,并使用树来生成设置UI面板.如果用户然后选择他想要的设置(可能是插件提供的设置的子集,因为他/她不能使用所有提供的设置),我会将Map解析为插件,如Map,其中Key是varName(来自示例:"buttonDelay"和"buttonDelaytime").并且我可能有多个容器用于不同的设置类型,例如Integer设置,有一个容器,但也用于布尔值,数组等.通过将地图解析为插件,插件可以向地图询问设置每个设置varName,例如:

public void initPluginSettings(Map<String,SettingsInterface> settingsMap){
BooleanSetting buttonDelay = settingsMap.get("buttonDelay"); 
IntegerSetting buttonDelayTime = settingsMap.get("buttonDelayTime");
}
Run Code Online (Sandbox Code Playgroud)

有人有更简单/更聪明的解决方案吗?或者这个问题有一些模式吗?我已经在网上搜索了但我找不到任何东西.要实现DSL,使用树来键入检查等对我来说这个问题似乎有点"太多".我的意思是,我可以做到这一点但我希望在开始之前得到其他人的建议.

先感谢您!

小智 2

怎么样:

interface Plugin {
  Map<String, String> getSettingsList();
  getPossibleValuesFor(String key);
  setValue(String key, .. value);
  .. getValue();
}
Run Code Online (Sandbox Code Playgroud)

getSettingsList() 将返回从键到类型的映射;getPossibleValuesFor() 的存在使得插件开发人员可以限制类型的默认范围或在设置之间强加依赖关系。然后为其添加持久性。