Witam,
temat banalny i oczywisty. Wykorzystuję do tego zwykłe reflekcje, ale mam pytanie: czy nie można zrobić tego łatwiej?
Mam klasę która jest używana przez wszystkie aplety i wrzucam tam zmienną statyczną, czy jest możliwe, żeby z tej zmiennej korzystać we wszystkich aplikacjach wykorzystując to, że wszystkie applety są na tym samym serwerze i uruchamiane są na jednej JVM?
Dzięki za pomoc.
Przecież aplet nie wykonuje się serwerze, więc skąd wiesz że wszystkie aplety są wykonywane przez tą samą JVM? Chyba, że chodzi Ci o takie coś, wszystkie aplety są na jednej stronie, jak użytkownik otworzy stronę to uruchamiają się wszystkie aplety z tej strony. Takie aplety mogą się bez problemu porozumiewać.
Nadajesz apletom nazwy
<applet code=... name="nos"></applet>
a potem w kodzie apletu (np. w metodzie init()) szukasz innych apletów o znanych nazwach
Applet a=null;
Enumeration<Applet> aplety=getAppletContext().getApplets();
while (aplety.hasMoreElements())
{
a=aplety.nextElement();
if(a.getName().equals(poszukiwanyAplet))
{
...
}
}
przez wszystkie aplety
Po co Ci więcej niż jeden applet na stronie?
Do komunikacji między apletami używa się metody Applet.getAppletContext(), która zwraca (zwykle z przeglądarki) obiekt implementujący interfejs AppletContext. Metody tego interfejsu pozwalają na całkiem znośnie działającą komunikację między apletami (za pomocą strumieni), w tym pozwala na uzyskanie referencji do wszystkich apletów w bieżącym dokumencie (witrynie). Umożliwia też określenie który z nich jest aktywny w danej chwili (zwykle to ten, który ma focus).
Mając referencje do wszystkich działających w dokumencie apletów można też przeprowadzić komunikację bezpośrednią, w tym celu aplety muszą znać swoje rzeczywiste typy i możliwości lub skorzystać z refleksji.
W przypadku kiedy aplet odpalony jest przez AppletViewer, to ten za pomocą metody setStub ustawia sobie obiekt implementujący interfejs AppletStub, a w nim metoda getAppletContext zwraca spreparowane środowisko odpalenia apletu (pojedynczy aplet w szczątkowym dokumencie). Dzięki temu środowisko uruchomienia apletu jest spójne niezależnie od tego czy aplet jest lokalnie odpalony na przeglądarce, przez appletviewer, czy z zewnętrznego serwera.
ups. Nie zauważyłem posta bo, który już o tym napisał.
Dzięki za odpowiedzi, ale akurat tą metodę znam dobrze, a szukam czegoś co pozwoli mi skomunikować klasy znajdujące się na jednej maszynie wirtualnej. Może inaczej napiszę:
mam 3 projekty, 2 to applety a jeden to projekt wspólny dla tamtych. Chciałbym aby zmieniając wartość zmiennej statycznej w klasie projektu wspólnego operacja ta była widoczna w obu projektach. Da się to zrobić?
"Umożliwia też określenie który z nich jest aktywny w danej chwili (zwykle to ten, który ma focus)." Bardzo mnie to zainteresowało.
Mam taką sytuację:
Mam stronkę na której jest aplet. Użytkownik na pewno będzie chciał odpalić kilka zakładek - czyli kilka stronek na których jest ten sam aplet. I teraz chciałbym aby one między sobą ustalały który jest aktywny. Tzn. wyobrażam sobie to poprzez zdarzenia: ten co ma focus wykona pewne działania np. zapis numeru zakładki itp.
Jakiś pomysł na wydajne wykonanie?
Kiedyś jak jeszcze nie było zabezpieczeń była możliwość komunikacji przez zmienne statyczne, jak mniemam to już nie jest możliwe ?
lipkerson napisał(a)
Mam taką sytuację:
Mam stronkę na której jest aplet. Użytkownik na pewno będzie chciał odpalić kilka zakładek - czyli kilka stronek na których jest ten sam aplet. I teraz chciałbym aby one między sobą ustalały który jest aktywny.
http://dev.keraj.net/aplety/activ.html (odpal sobie w dwóch oknach, tak żebyś widział to drugie będąc w jednym)
rozwiązane takie na szybko:
w appletowym start() zapisuję aktywny applet w zmiennej statycznej, jeśli jakiś już tam jest zapisany, to mówię mu, że już nie jest.
kod tu : http://dev.keraj.net/aplety/Naplet.java
dodatkowo w javascripcie wykrywam czy tab/okno w przeglądarce ma focus i jeśli ma, to odpalam metodę start() appletu (a można jakąkolwiek)
window.addEventListener('focus', function() {
var aplt = document.getElementById("aplet");
if(aplt!=null)
{
aplt.start();
}
});
Dzięki - chodziło mi mniej więcej o to. Tzn. ten link co wstawiłeś nie do końca działa - albo inaczej: nie wiem jak ma działać. Ten drugi pokazuje mi się ze jest zawsze aktywny. Może to przez Chroma? Ale koncept rozumiem i podoba mi się jego prostota. Trochę przemodyfikuje bo potrzebuje wiedzieć jeszcze id danej zakładki by móc je rozróżniac między sobą, ale to już szczegół.
Pozdrawiam