JS w Javie

0

Najprostszy przypadek. Od niego zacznę pytanie. Jak zrobić, żeby w javie z utworzonym okienkiem, Jpanelem i czymkolwiek innym udało się dodać taki kod JavyScript, który działałby na jakimś obiekcie z Javy jak np. na DIVie w HTML, czyli mógłby rysować, wyświetlać itd.

Docelowo chodzi o to, jak połączyć Google Maps JavaScript v3 z Javą, czyli jak przy pomocy kodu JavyScript wyświetlić coś w oknie Javy... Wszędzie tylko ten JXBrowser ale to poszukuję czegoś Free.

Dlatego będę wdzięczny za jakąkolwiek pomoc, bo siedzę już tydzień i mam dość. Co za ... zrobić API do JS a nie do Javy... Chyba że o czymś nie wiem, ale API do Javy było ale już nie jest...

3

w javaFX jest webView, obsluguje js, moze wystarczy do twoich potrzeb

0

Wielkie dzięki. Działa.

Ale dwie muszę powiedzieć. Java byłaby fajniejsza, gdyby nie jej za duża elastyczność wprowadzająca taki zamęt, że nie da się tego opisać. Jeśli zaś chodzi o googla, to bałagan tam jest taki, że też nie ma co komentować. Skoro można użyć webview to taki kod powinien być na początku dokumentacji google maps. Ale nie, jest wszystko, tylko nie to.

0

To złe wrażenie, bo wiem co to Java i co JavaScript, gdyby nie to, to nie szukałbym sposobu na powiązanie jednego i drugiego. Google Maps udostępnia API dla JS i tam coś jeszcze można znaleźć. Ale chcąc zrobić coś w Javie z Google Maps to trzeba było sporo się nakombinować, bo dokumentacja Google Maps niby uwzględnia javę, ale nie bardzo, najnowsze API jest dla JavyScript. Dla Javy to niby jest, ale nic nie działa (łącznie z przykładami). Dla JavyScript działa. A więc pozostało tylko pytanie jak wcisnąć coś z JavyScript do Javy. No i tutaj możliwości było kilka, ale niektóre płatne, niektóre tak udokumentowane, że nie wiem co się dzieje. webview tutaj pomógł bardzo ładnie, jest darmowy i było mało pisania, żeby wyświetlić coś z html.

0

Odwołuje, że WebView działa. Działa przez chwilę i przestaje. Problem "Outstanding resource locks detected", znany z javafx i do teraz nie usunięty, więc WebView jest do niczego.

Nashorn... sam interpreter to jedno, ale jak nie interpretuje też HTML to nic nie wyświetlę.

1

Browser + BrowserFunction chyba najlepszy sposób na komunikację java z js. Korzysta z domyślnej przeglądarki systemowej.
Wywołanie funkcji js z poziomu java ( przykład ):

private double testValue = 0;
//...
browser = new Browser( this, SWT.NONE );
//...

public void getAlert(){
    browser.evaluate("testMethod();");
}

private void createBrowserFunctions(){
    new BrowserFunction(browser, "onTestValueChanged"){
        public Object function(Object[] arguments){
        syncTest((Double)arguments[0]);
        return null;
    }
  };
}

private void syncTest(final Double testValue){
    if (this.testValue != testValue.doubleValue()){
        this.testValue = testValue.doubleValue();
        fireTestValueChanged();
    }
}

private void fireTestValueChanged(){
    Object[] allListeners = listeners.getListeners();
    for(int i = 0; i < allListeners.length; i++){
         // Interfes zawierający testChanged.
         TestListener listener ( TestListener )allListeners[i];
         listener.testChanged();
    }
}

JS:

var testValue = 0;

window._blockEvents = false;

window.testMethod = function(){
   window._blockEvents = true;
   window.alert("Test!");
   testValue = 5;
   window._blockEvents = false;
}

window._handleTestChanged = function(){
      if( !_blockEvents ) {
    // BrowserFunction:
    onTestValueChanged( testValue );
  }
};

Mam nadzieję, że niczego nie namieszałem w powyższym kodzie pisany z palca.

Jeżeli chodzi o fx to tak jak koledzy wyżej wspomnieli WebBrowser także sprawdzi się wyśmiecie, chociaż ma pewne ograniczenia dotyczące wtyczek i nie wiem jak tam jest z komunikacją dwukierunkową.

0

WebBrower (WebView chyba) z fx się nie sprawdził. Parę razy przybliżysz, oddalisz mapkę googla i zanika kontakt. Do bardziej prymitywnych się nadaje, ale do tego odpadł. Zresztą nie tylko ja miałem z tym problem. Gdzieś pisali, że trzeba czekać na poprawki w javie 9, więc pozostawie to bez komentarza.

Jeśli chodzi o Browser to zdecydownie pewnie byłby lepszy, gdyby nie to, że to musi być free, a jeśli Cię dobrze rozumiem, to masz na myśli tę klasę Browser co to kosztuje i to sporo.

Więcej o javie nie znalazłem :/

0

Nie mówiłem, że SWT.Browser, dlatego właśnie liczyłem, że ktoś poda, o który Browser chodzi. Jest jeszcze jeden Browser, płatny. Sprawdzę SWT.

0

Ok, Browser może i działa, ale stwierdziłem, że jak to ma działać w javie to chyba prościej i bardziej uczciwie będzie to napisać w C++ i wykorzystać OLE. Trochę pisania było, bo nigdy z OLE nie korzystałem, więc roboty było, ale czyste WinAPI poszło elegancko. Działa mapka w zwykłym okienku. Niepotrzebnie tylko marnowałem tyle czasu na Jave.

0

Miałem na myśli okienko, ale nie okienko osobne, tylko normalnie okienko w okienku, na podobnej zasadzie jak JPanel w Javie. A więc można w jednym oknie zrobić nawigacje.

Z javą to jest ten problem, że jest przesadnie zachwalona. Na tym głupim przykładzie okazało się, że główne klasy potrafią nie działać poprawnie i w dokumentacji nie ma o tym ani słowa a z poprawką się ociągają.

Najchętniej do takich zastosowań to przekompilowałbym jakiś silnik przeglądarki, ale nie za bardzo mam czas, żeby to ogarnąć.

0

No jave chwalą za przenośność, chociaż z tym to bardzo spierałbym się, bo jaka to przenośność jak aplikacje na PC bez poprawek nie działają na Androidzie. To samo dotyczy sprzętu. Przecież jak coś nie ma GPS to i Java go nie stworzy. Nawet pomiędzy systemami działa to średnio (dowodem są programy na Win, które potem na Linuksie nie odpalają, albo program na jeden telefon i drugi z tym samym systemem nie działa poprawnie).

Plusem jest automatyczne czyszczenie nieużywanych zmiennych, ale działa to tak, że jak ktoś nie pisał nigdy w C++ to nie wie co to znaczy mało pamięci. Java jest strasznie zasobożerna. Kiedyś mój wykładowca przeklną mój program w C++, kiedy się okazało, że poradził sobie o około 5 poziomów w algorytmie MIN-MAX więcej niż to co wcześniej widział w Javie. Nic dziwnego, bo to samo w Javie zżerałoby więcej pamięci i jeszcze wolno chodziłoby.

Dlatego na Javę z reguły psioczę, bo co do niej podchodzę to wiecznie coś nie działa tak jak powinno i przesiadam się z powrotem na C++ :P.

0

Jeszcze jest też wbudowane wsparcie dla wspóbieżności i rozproszoności co jest plusem, ale wydajność to zdecydowanie minus.

A chyba największy minus to wmówienie ludziom, że Java jest prostsza niż C++. W efekcie powstają mnóstwo programów, które można nazwać gniotami. Z jednej strony mogłyby być przydatne, a wykrzaczają się na jakiś głupich funkcjach (np. Zapisz).

0
RRRrrrr napisał(a):

Jeszcze jest też wbudowane wsparcie dla wspóbieżności i rozproszoności co jest plusem, ale wydajność to zdecydowanie minus.

A chyba największy minus to wmówienie ludziom, że Java jest prostsza niż C++. W efekcie powstają mnóstwo programów, które można nazwać gniotami. Z jednej strony mogłyby być przydatne, a wykrzaczają się na jakiś głupich funkcjach (np. Zapisz).

Dokładnie, z ust mi to wyjąłeś. Struktury obu języków są tak zbliżone, że różnicy wielkiej nie ma w podstawach. Wbudowane oczyszczanie pamięci w javie to pozorny plus, bo przez to ludzie nie wiedzą co to pamięć. W efekcie nawet nie mają też pojęcia jak dużo zasobów zżera dziedziczenie wszystkiego po wszystkim. Czytelność kodu javy też jest dość marna, bo jak jest klasa w klasie klasy w funkcji jako parametr funkcji i wszystko zagnieżdżone w tym samym miejscu to... w C++ uczą, że aby kod był czytelny to rozdzielić pliki .h od .cpp, żeby w .h nie zawierać całych funkcji jak nie są króciutkie.

A to że są gnioty wszędzie to fakt, ale jeśli chodzi o programy to najlepiej wyglądają te, które zostały napisane w językach C/C++, bo z reguły nie ma problemu z nimi wielkiego.

Od siebie dodam, że wiem co to jest optymalizacja i zasobożerność. Moje główne środowisko, w którym się obracam to minimalistyczne mikrokontrolery wykorzystywane w systemach czasu rzeczywistego, więc nie raz zdarza mi się przeliczać wszystko na bajty i cykle zegara, żeby zmieścić się w oknie. Tylko czasami muszę przejść przez coś co mniej mi się podoba :).

Swoją drogą po głowie chodzi mi chęć kompilacji silnika Gecko, ale jak to zrobić pod mingw... :P.

0

Ciekawi mnie kiedy ludzie przestaną mylić JDK z SDK Androidowym. Pewnie w tym samym momencie, w którym uświadomią sobie, że nie należy wykorzystywać języków wysokopoziomowych do realizacji niskopoziomowych celów. Albo wtedy, kiedy uświadomią sobie, że w Javie nie ma funkcji. Albo nauczą się, że argument "kod jest nieczytelny ponieważ wygląda nieczytelnie jeśli stosuje się dobre praktyki z innego języka" jest raczej słaby.

0

Czytelność kodu javy też jest dość marna, bo jak jest klasa w klasie klasy w funkcji jako parametr funkcji i wszystko zagnieżdżone w tym samym miejscu to... w C++ uczą, że aby kod był czytelny to rozdzielić pliki .h od .cpp, żeby w .h nie zawierać całych funkcji jak nie są króciutkie.

Czytelność kodu wynika głównie z umiejętności programisty, a nie użytego języka. Bo w C++ to niby nie można pozagnieżdżać klas na 10 poziomów i zrobić pojedynczej funkcji na 2000 linii? Zabawne. A konieczność zabawy z plikami nagłówkowymi też potrafi wprowadzić całkiem niezły bałagan, w porównaniu z językami, które mają porządny system modułów.

0
wartek01 napisał(a):

Albo wtedy, kiedy uświadomią sobie, że w Javie nie ma funkcji.

A niby co jest? To, że ktoś nazwał funkcję metodą to nie znaczy, że nie jest funkcją :). Wiesz, dzisiaj wybierając się na wakacje dostajesz ulotkę z "destynatami" do wyboru. Tylko pytanie czemu, skoro destynat to nic innego jak "kierunek podróży", "miejsce" itp. Podobnie jest z nadużywanym zapożyczeniem, gdzie się z czymś zgadzasz to mówisz "dokładnie" zamiast typowe "tak". Miejmy swój język :), nawet z małymi błędami ale swój. Ja osobiście specjalnie zawsze ale to zawsze mówię o funkcji. Raz, że nie widzę specjalnej różnicy (mało mnie obchodzi czy funkcja w klasie to metoda a poza klasą to funkcja, bo to poziom dyskusji o wyższości świąt ... a nie merytoryczna dyskusja na temat tego co to ma robić lub co nie działa) a dwa, że mam swój język i aż tak absurdalnego zapożyczenia nie muszę stosować.

wartek01 napisał(a):

Pewnie w tym samym momencie, w którym uświadomią sobie, że nie należy wykorzystywać języków wysokopoziomowych do realizacji niskopoziomowych celów.

Powiedz to tym, którzy szukają "kompilatorów" do Javy dla takich mikrokontrolerów jak ATMEGA8 i dziwią się, że tego nie ma, albo jest nie tak dobre jak normalna java. To są dopiero przegięcia.

wartek01 napisał(a):

Albo nauczą się, że argument "kod jest nieczytelny ponieważ wygląda nieczytelnie jeśli stosuje się dobre praktyki z innego języka" jest raczej słaby.

Wiesz, widziałem "proste" przykłady dla Androida i jak widziałem tę prostotę to uświadomiłem sobie dlaczego połowa programów na androida ledwie działa (na czele z firmowymi typu YouTube). Chcąc tworzyć proste środowisko należy mieć świadomość, że im więcej osób się do niego dobierze, tym gorzej dla niego. Do tego doprowadziła właśnie Java. Pozorna prostota i moda na Jave spowodowała, że coś co mogłoby być rewelacyjne stało się niekiedy parodią (Android i jego Java wraz z programami). I właśnie na przykładzie Androida można powiedzieć, że to jest właśnie ten przypadek, kiedy ktoś zamiast językiem niskiego poziomu próbuje zrobić coś językiem wysokiego poziomu. Wyobraź sobie, że można byłoby pisać w C/C++, a cały android chodziłby bezpośrednio na linuksie ze standardowymi okienkami. Przecież dla tabletów to byłby ideał. Wtedy dałoby się poczuć moc tych urządzeń. A tak tnie wszystko nawet na XPerii za 2k zł

Krolik napisał(a):

Czytelność kodu wynika głównie z umiejętności programisty, a nie użytego języka. Bo w C++ to niby nie można pozagnieżdżać klas na 10 poziomów i zrobić pojedynczej funkcji na 2000 linii? Zabawne. A konieczność zabawy z plikami nagłówkowymi też potrafi wprowadzić całkiem niezły bałagan, w porównaniu z językami, które mają porządny system modułów.

Można, tylko z racji tego, że C++ nigdy nie promował się jako super ekstra łatwy i prosty to sporo kodu jest napisana z zachowanie pewnego poziomu logiki. Nawet te gorsze, pisane na kolanie są pisane przez osoby, które tego języka się nie boją i pewne doświadczenie mają. Java nie jest złym językiem. Po prostu jave przejęła duża część ludzi, którzy są przekonani, że tam bez programowania stworzą windowsa. I to jest jej przekleństwo, bo potem takie osoby piszą kody przykładowe a w nich tego typu konstrukcje jak opisane wyżej :). To miałem na myśli.

I Panowie, ja nie atakuje Javy jako Javy. Przekleństwem jest ten marketing powodujący spadek jakości programów w tym języku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1