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ę!
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). –
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