2011-05-16 11 views
9

Pracuję z apletem Java, który jest apletem, który pomaga pisać za pomocą myszy. W moim przypadku próbuję włączyć to do mojego projektu strony internetowej w następujący sposób:Pomost między apletem Javy a elementami sterującymi wprowadzaniem tekstu na stronie internetowej

Gdy użytkownik kliknie na element wejściowy (textbox/textarea) na stronie, ta aplet JAVA wczytuje się na samej stronie. Na zrzucie ekranu przedstawionego poniżej apletu JAVA użytkownik wskazuje alfabet, a odpowiedni tekst zostanie zapisany w polu tekstowym apletu.

enter image description here

Teraz co próbuję zrobić, to dostać ten tekst z TextBox apletu do elementu wejściowego na stronie internetowej. Wiem, że to wymaga interakcji między Javą i JavaScript, ale nie będąc profesjonalistą, naprawdę nie mam haczyka. Oto aplet Java i kod, który napisałem.

aplet Java i kod jQuery (298kB): http://bit.ly/jItN9m

Proszę mógłby somebdoy pomoc dla rozszerzenia tego kodu. Wielkie dzięki!

Aktualizacja

Szukałem gdzieś i znalazłem to -> Aby uzyskać tekst wewnątrz pola tekstowego Javy, metoda getter w aplecie pobrać tekst:

public class MyApplet extends JApplet { 
    // ... 
    public String getTextBoxText() { return myTextBox.getText(); } 
} 

W JQuery Kod następujące linie mają być dodane myślę:

var textBoxText = $("#applet-id")[0].getTextBoxText(); 
//Now do something with the text 

dla kodu apletu, widziałem stronę git GNOME tutaj. Wywołanie getText już istnieje - spójrz na dół tego pliku: http://git.gnome.org/browse/dasher/tree/java/dasher/applet/JDasherApplet.java

Potrzebuję wywołać "getCurrentEditBoxText", ale kiedy należy wywołać tę metodę "getCurrentEditBoxText"? W moim przypadku prawdopodobnie musiałbym to zrobić, gdy użytkownik kliknie nową kontrolkę wejścia itp.

Odpowiedz

8

Możesz mieć pełną komunikację między apletem a dowolną metodą javascript na stronie. Kyle ma dobry post demonstrujący jak JavaScript może wywoływać aplet i żądać wartości tekstowej. Zakładam jednak, że chcesz, aby pole tekstowe HTML było aktualizowane przy każdym kliknięciu myszką, co oznacza, że ​​aplet musi komunikować się ze stroną.Chciałbym zmodyfikować skrypt do czegoś takiego:

var activeTextArea = null; 

$('textarea, input').click(function() { 
    $(this).dasher(); 
    activeTextArea = this; 
}); 

function updateText(text) { 
    // Careful: I think textarea and input have different 
    // methods for setting the value. Check the 
    // jQuery documentation 
    $(activeTextArea).val(text); 
} 

Zakładając, że źródło dla apletu, można mieć to komunikować się z powyższych funkcji javascript. Dodaj ten import:

import netscape.javascript.JSObject; 

a następnie w cokolwiek onClick obsługi masz za kliknięcia myszką, dodać:

// After the Applet Text has been updated 
JSObject win = null; 
try { 
    win = (JSObject) JSObject.getWindow(Applet.this); 
    win.call("updateText", new Object[] { textBox.getText() }); 
} catch (Exception ex) { 
    // oops 
} 

To będzie zaktualizować tekst za każdym razem, że fragment kodu jest tzw. Jeśli NIE masz dostępu do źródła apletu, sprawy stają się trudniejsze. Trzeba ustawić pewien czas trwania javascript, który stale odczytuje wartość z apletu, ale zakłada, że ​​aplet ma taką metodę, która zwraca wartość pola tekstowego.

Zobacz także: http://java.sun.com/products/plugin/1.3/docs/jsobject.html

Aktualizacja Modyfikowanie aplet jest najlepszym strzał, ponieważ to właśnie tam jakiekolwiek zdarzenie zostanie uruchomiony. Na przykład, jeśli chcesz, aby pole tekstowe HTML zmieniało się przy każdym kliknięciu, kliknięcie odbywa się w aplecie, który należy zmodyfikować, aby uruchomić aktualizację, jak opisano powyżej. Bez modyfikowania apletu widzę dwie opcje. Opcja nr 1 używa Timer:

var timer; 
var activeTextArea; 

$('textarea, input').click(function() { 
    $(this).dasher(); 
    activeTextArea = this; 
    updateText(); 
} 

function updateText() { 
    // Same warnings about textarea vs. input 
    $(activeTextArea).val($('#appletId')[0].getCurrentEditBoxText()); 
    timer = setTimeout("updateText()", 50); 
} 

function stopUpdating() { 
    clearTimeout(timer); 
} 

ten jest podobny do kodu powyżej, z wyjątkiem kliknięcie na polu tekstowym wyzwala funkcję updateText() który będzie ustawić wartość pola tekstowego HTML do wartości pola tekstowego Applet zapętlenie co 50ms. Spowoduje to niewielkie opóźnienie między kliknięciem a aktualizacją, ale będzie niewielkie. Możesz zwiększyć częstotliwość timera, ale to spowoduje spadek wydajności. Nie widzę, gdzie "ukryłeś" aplet, ale ta sama funkcja powinna zadzwonić pod numer stopUpdating, abyśmy nie próbowali już kontaktować się z ukrytym apletem.

Opcja nr 2 (nie kodowane)

będę spróbować uchwycić kliknięcie w aplecie, ponieważ pęcherzyki przez Dom HTML. Następnie można pominąć timer i wprowadzić zachowanie click() w kontenerze apletów, aby wykonać tę samą aktualizację. Nie jestem jednak pewna, czy takie wydarzenia się bańczą, więc nie jestem pewien, czy to zadziała. Nawet gdyby tak było, nie jestem pewien, czy byłby kompatybilny w różnych przeglądarkach.

Opcja nr 3

Trzecia opcja to nie aktualizuje pole tekstowe HTML na każde kliknięcie. To byłaby po prostu kombinacja Kyle'a i moich postów powyżej, aby ustawić wartość pola tekstowego za każdym razem, gdy skończysz z apletem.

+0

Cześć jrookover. Dzięki za skomplikowaną odpowiedź. Widząc twój wpis, zaktualizowałem moje pytanie, podając więcej informacji na temat kodu apletu i niektórych moich odkryć. Byłoby wskazane, gdybyś na tym etapie mógł zalecić zmiany wymagane w pliku jQuery. – Cipher

+0

W pracy teraz, ale opublikuję aktualizację później tego wieczoru. Prawdopodobnie zadziała z limitem czasu javascript, który zasugerowałem. Jedyny problem polega na tym, że istnieje równowaga między reakcją (tj. Stałym testowaniem dla aktualizacji) a wydajnością (tj. Stałe pingowanie jest drenażem zasobów). Najlepszym * wdrożeniem byłoby zmodyfikowanie kodu Applet, aby zareagować na wydarzenie Click. Chociaż zastanawiam się, czy takie zdarzenia pojawiają się w DOM? – jbrookover

+0

@jbrookover: Czy mogę przesłać e-mailem na ten temat? Zablokowany od czasu molwy. Poproszę o małą pomoc. : - | – Cipher

1

This page wyjaśnia, jak manipulować DOM z apletu Java. Aby znaleźć element wejściowy, po prostu wywołaj funkcję document.getElementById (id) z identyfikatorem id atrybutu pola wprowadzania tekstu.

4

Oto możliwe rozwiązanie. Aby uzyskać tekst wewnątrz swojego pola tekstowego Java napisać metodę getter w aplecie pobrać tekst:

public class MyApplet extends JApplet { 
    // ... 
    public String getTextBoxText() { return myTextBox.getText(); } 
} 

W kodzie jQuery dodać następujące wiersze:

var textBoxText = $("#applet-id")[0].getTextBoxText(); 
//Now do something with the text 

znalazłem najbardziej z tego, co napisałem powyżej here. Mam nadzieję że to pomoże.