5

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

例如,一个名为“KeyboardPlugin”的插件可以支持设置按键之间的延迟,还可以显示所有支持按键的列表。例如,另一个插件可以称为“MouseMovePlugin”,用户可以在其中选择鼠标的准确性及其速度。

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

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

插件设置如下所示:

  • a)"请输入两次按键之间的延迟 -> [Textbox with Int as input] (with min 1; max 500)
  • b)“bla bla -> [复选框](带布尔值)”
  • c)“Bla bla 2 -> [文本框](以字符串值作为输入;与设置 b 相关!)
  • d) "选择要按下的按钮" ["a","b","c"]

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

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

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"
}

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

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

有人有更简单/更智能的解决方案吗?或者这个问题有一些模式吗?我已经在网上搜索过,但我真的找不到任何东西。要实现 DSL,使用树类型检查等对我来说似乎有点“太多”这个问题。我的意思是,我可以做到这一点,但我很想在开始之前得到其他人的建议。

先感谢您!

4

2 回答 2

2

怎么样:

interface Plugin {
  Map<String, String> getSettingsList();
  getPossibleValuesFor(String key);
  setValue(String key, .. value);
  .. getValue();
}

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

于 2013-03-11T15:18:30.907 回答
1

怎么样:

Interface Plugin extends Serializable
{
    // You don't know what the plugin is, the possible options, or how best to set them. Let plugin developers build their own settings UI, you just grab and display it in your own JPanel.
    public JPanel getOptionsPanel();

    // We don't know the types of data that can be returned from plugins, so build a map of the setting name to what the user set it to, and return that to the plugin itself.
    public Map<String, Object> getUserSettings();
}

这减轻了您试图弄清楚如何显示插件设置的负担。对于每个插件,获取其选项面板,并将其添加到您的选项面板中。然后您可以将选项名称和值返回给插件进行处理。

于 2013-03-11T16:02:38.153 回答