2013-03-11 14 views
5

Aktualnie pracuję nad aplikacją, która otrzymuje polecenia od innych urządzeń. Dostarczę interfejs umożliwiający innym opracowanie własnej interpretacji (wtyczki) przychodzących poleceń. Każda z wtyczek opracowanych przez innych może mieć dowolne niestandardowe ustawienia, które muszą być dostarczane przez użytkowników.Java: Jak radzić sobie z niestandardowymi ustawieniami w wtyczkach dla mojej aplikacji?

Na przykład wtyczka o nazwie "KeyboardPlugin" może obsługiwać ustawienia, aby ustawić opóźnienie między naciśnięciami klawiszy, ale także wyświetlać listę wszystkich obsługiwanych klawiszy, które należy nacisnąć. Inną wtyczką może być na przykład "MouseMovePlugin", gdzie użytkownik może wybrać dokładność myszy i jej szybkość.

Teraz mój problem polega na tym, że ustawienia każdej wtyczki muszą być 1. pokazane w interfejsie użytkownika, 2. po wybraniu ustawień przez użytkownika, muszą zostać sparsowane z powrotem do wtyczki, aby umożliwić wtyczce co wybrał użytkownik.

Pracuję z Javą, a interfejs jest rozwijany w Swing. Istnieje panel opcji, który pokazuje opcje, które nie są bezpośrednio związane z wtyczką, jak typowe opcje. Ale na tym samym panelu chcę pokazać ustawienia dostarczone przez wtyczkę.

ustawieniach wtyczki wyglądać następująco:

  • a) "Podaj opóźnienie między naciśnięciom dwóch przycisków -> [Ramka z Int jako wejście] (przy min 1; max 500)
  • b) "bla -> [pole wyboru] (z logiczna)"
  • c) "bla bla 2 -> [Ramka] (o wartości ciąg jako wejścia;! związany w ustawieniu b)
  • d)" Wybierz przycisk, aby nacisnąć "[" a "," b "," c "]

Jak widać, ustawienia wtyczki mogą na przykład być typu int, boolean, string, ale także jak np. D, tablica lub enum. Moim problemem jest teraz, jak mogę sobie z tym poradzić? Każda wtyczka może mieć zestaw typów ustawień, które również mogą od siebie zależeć, np. C zależy od wyboru użytkownika b.

1) Najpierw potrzebuję techniki, aby zapytać wtyczkę o jej ustawienia, cóż, mógłbym po prostu wywołać metodę podaną w interfejsie wtyczki, ale co powinieneś zwrócić? Mam na myśli, że lista może działać, ale nie ma zależności między opcjami ustawień.

2) W jaki sposób mogę "ustawić ustawienia wtyczki". Jeśli użytkownik wybierze preferowane ustawienia, to w jaki sposób mogę powiedzieć wtyczkę?

Jedynym rozwiązaniem, które mogłem zorientować się w głowie do dziś jest następująca: Język specyficzny prosty domeny (DSL), który jest tak: varName: typ (min, max, domyślnie) „UI pytanie” w podanym przykładzie:

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

chciałbym przeanalizować DSL ustawień na drzewie Java, aby mieć możliwość prostego sprawdzania typu i używać do generowania drzewa również panel ustawień UI. Jeśli użytkownik wybierze ustawienia, które chce mieć (które mogą być podzbiorem dostarczonych ustawień przez wtyczkę, ponieważ nie musi używać wszystkich dostarczonych ustawień), przetworzyłbym Mapę na wtyczkę, np. Mapę, gdzie klucz jest nazwą varName (na przykład: "buttonDelay" i "buttonDelaytime"). I prawdopodobnie miałbym wiele kontenerów dla różnych typów ustawień, jak dla ustawienia Integer, istnieje kontener, ale także dla wartości logicznej, tablicy itp. analizując mapę do wtyczki, wtyczka może poprosić mapę do ustawień dla każdego ustawienia varName, na przykład tak:

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

Czy ktoś ma prostszą/inteligentniejsze możliwe rozwiązanie? Czy istnieją pewne wzorce tego problemu? Przeszukałem już Internet, ale nie mogłem czegoś znaleźć. Aby zaimplementować DSL, użyj drzewa do wpisania czeku itp., Wydaje mi się nieco "za dużo" dla tego problemu. Chodzi mi o to, że mógłbym to zrobić, ale chciałbym, aby inni ludzie wysunęli sugestie zanim zacznę.

Z góry dziękuję!

Odpowiedz

2

jak o czymś takim:

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

getSettingsList() zwróci mapę z kluczy do rodzajów; getPossibleValuesFor() jest dostępny, więc deweloper wtyczek może ograniczyć domyślny zakres typów lub narzucić zależności między ustawieniami. A następnie dodaj do niego uporczywość.

+0

Dziękuję również za Twój komentarz! Myślę, że to rozwiązanie mogłoby mi pomóc, ... wtedy cała logika "które ustawienie wyświetlać" byłaby po stronie wtyczki, ale jak mam sobie radzić z blokami ustawień? Mam na myśli, że jeśli N ustawień przekaże na np. wartość boolowska, następnie wtyczka musi zwrócić listę (lub mapę) ustawień i wartości. Nie jestem pewien, czy jest to łatwe w obsłudze, ponieważ muszę śledzić, które ustawienia należy zastąpić innymi (na przykład użytkownik zmienia swój wybór). –

+0

Nie trzeba będzie zwracać N ustawień; kiedy użytkownik zmieni tę wartość logiczną, będziesz wywoływał funkcję setValue(), aby wtyczka wiedziała, co jest potrzebne do włączenia, wyłączenia lub ograniczenia, i w tym momencie możesz ponownie narysować interfejs, ponownie wywołując funkcję getSettingsList(). – miki

1

Jak o czymś takim:

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

Stawia to obciążenia od Ciebie na próbuje dowiedzieć się, jak wyświetlić ustawienia wtyczki. Dla każdej wtyczki pobierz panel opcji i dodaj go do swojego. Następnie możesz po prostu zwrócić nazwy opcji i wartości z powrotem do wtyczki, aby się z nimi uporać.

+0

Dzięki! Ale domyślam się, że nie mam żadnych możliwości zapisania ustawień ustawionych przez użytkownika ... ale prawdopodobnie będę tego potrzebował później. –

+0

Przedłuż Serializable. Zaktualizuję przykład. Twórcy wtyczek będą musieli zająć się pisaniem i ładowaniem danych, co jest w porządku, ponieważ nie można się spodziewać, że będzie wiedział, co to jest. –