5

現在、他のデバイスからコマンドを受信するアプリケーションに取り組んでいます。受信コマンドの独自の解釈 (プラグイン) を他のユーザーが開発できるようにするためのインターフェイスを提供します。他の人が開発した各プラグインには、ユーザーが提供する必要があるカスタム設定を含めることができます。

たとえば、「KeyboardPlugin」と呼ばれるプラグインは、キーを押す間の遅延を設定する設定をサポートするだけでなく、サポートされているすべてのキーのリストを表示することもできます。別のプラグインは、たとえば「MouseMovePlugin」と呼ばれ、ユーザーはマウスの精度と速度を選択できます。

今私の問題は、各プラグインの設定が1である必要があることです.UIに表示されます.2.ユーザーが設定を選択した後、ユーザーが選択したものをプラグインに知らせるために、それらを解析してプラグインに戻す必要があります.

私は Java を使用しており、UI は Swing で開発されています。一般的なオプションなど、プラグインに直接関係しないオプションを表示するオプション パネルがあります。しかし、同じパネルで、プラグインによって提供される設定を表示したいと思います。

プラグインの設定は次のようになります。

  • a)"2 つのキーを押す間の遅延を入力してください -> [入力として Int を含むテキスト ボックス] (最小 1、最大 500)
  • b)「bla bla -> [Checkbox] (ブール値付き)」
  • c) "Bla bla 2 -> [Textbox] (文字列値を入力として、b の設定に関連します!)
  • d) 「押すボタンを選択」 ["a","b","c"]

ご覧のとおり、プラグイン設定は、たとえば int、boolean、string 型にすることができますが、d のように、配列または列挙型にすることもできます。私の問題は、どうすればこれを処理できるかということです。各プラグインは、ユーザーが選択した b に依存する例 c のように、相互に依存する一連の設定タイプを持つことができます。

1) まず、プラグインにその設定を問い合わせるテクニックが必要です。プラグイン インターフェイスで提供されているメソッドを呼び出すだけでよいのですが、何を返す必要がありますか? つまり、リストは機能しますが、設定オプション間に依存関係はありません。

2)「プラグインで設定を行う」にはどうすればよいですか。ユーザーが好みの設定を選択した場合、プラグインにどのように伝えるのですか?

今まで頭の中で理解できた唯一の解決策は次のとおりです: 次のような単純なドメイン固有言語 (DSL): varName: type(min,max,default) "UI question" as a given example:

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")。そして、おそらく、整数設定のように、さまざまな設定タイプ用に複数のコンテナを用意するでしょう。コンテナがありますが、ブール値、配列などもあります。プラグインへのマップを解析することにより、プラグインはマップに次の設定を要求できます。たとえば、次のような各設定 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 に答える