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

时间:2013-03-11 14:23:12

标签: java swing plugins settings

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

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

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

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

插件设置如下所示:

  • a)“请输入两次按键之间的延迟 - > [Textbox with Int作为输入](最小1;最大500)
  • b)“bla bla - > [Checkbox](带 布尔)“
  • c)“Bla bla 2 - > [Textbox](以String值作为输入; 关于设置b!)
  • d)“选择按钮”[“a”,“b”,“c”]

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

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

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

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

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

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

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

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

提前谢谢!

2 个答案:

答案 0 :(得分:2)

如下:

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

getSettingsList()会返回从键到类型的映射; getPossibleValuesFor()是这样的,所以插件开发人员可以限制类型的默认范围或强加设置之间的依赖关系。然后为它添加持久性。

答案 1 :(得分: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();
}

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