2011-05-16 8 views
9

Ho lavorato con un'applet Java che è un'applet che aiuta a scrivere usando solo un mouse. Per il mio caso, sto cercando di incorporare questo nel mio progetto webiste come segue:Bridge tra l'applet Java ei controlli di input del testo nella pagina Web

Quando l'utente fa clic su qualsiasi elemento di input (casella di testo/area di testo) sulla pagina, questa applet Java viene caricata sulla pagina Web stessa. Nello screenshot dell'applet JAVA visto sotto, l'utente punta a un alfabeto e il testo corrispondente viene scritto nella casella di testo dell'applet.

enter image description here

Ora quello che sto cercando di fare è quello di ottenere il testo dalla casella di testo della applet per l'elemento di input sulla pagina web. So che questo ha bisogno di un'interazione tra Java e JavaScript, ma non essendo un professionista, non ne ho davvero la possibilità. Ecco l'applet Java e il codice che ho scritto.

applet Java e codice jQuery (298KB): http://bit.ly/jItN9m

prega potrebbe somebdoy aiuto per estendere questo codice. Grazie mille!

Aggiornamento

ho cercato qualche parte e trovato questo -> Per ottenere il testo all'interno della casella di testo Java, un metodo getter nella Applet per recuperare il testo:

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

Nel JQuery codice, sono da aggiungere le seguenti righe penso:

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

per il codice dell'applet, ho visto una pagina Git di GNOME qui. La chiamata getText esiste già - guarda il fondo di questo file: http://git.gnome.org/browse/dasher/tree/java/dasher/applet/JDasherApplet.java

Avrei bisogno di chiamare 'getCurrentEditBoxText', ma quando dovrebbe essere chiamato questo metodo 'getCurrentEditBoxText'? Nel mio caso, probabilmente dovrei farlo quando l'utente fa clic su un nuovo controllo di input ecc.

risposta

8

È possibile avere una comunicazione completa tra l'applet e qualsiasi metodo javascript sulla pagina. Kyle ha un buon post che dimostra come Javascript può chiamare l'applet e richiedere il valore del testo. Tuttavia, presumo che tu voglia che il campo di testo HTML si aggiorni con ogni clic del mouse, il che significa che l'applet deve comunicare con la pagina.Vorrei modificare la javascript per qualcosa di simile:

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

Supponendo di avere la fonte per l'applet, si può avere la comunicazione con il sopra funzione javascript. Aggiungere questa importazione:

import netscape.javascript.JSObject; 

E poi, in qualunque gestore che hai per il clic del mouse onClick, aggiungere:

// 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 
} 

che aggiornerà il testo ogni volta che quel pezzo di codice viene chiamato. Se NON hai accesso alla fonte dell'applet, le cose diventano più complicate. Avresti bisogno di impostare un qualche modo di timeout javascript che legge costantemente il valore dall'applet, ma questo presuppone che l'applet abbia un tale metodo che restituisca il valore della casella di testo.

Vedere anche: http://java.sun.com/products/plugin/1.3/docs/jsobject.html

Aggiornamento Modifica l'applet è il tuo colpo migliore in quanto è qui che ogni caso sarebbe stato attivato. Ad esempio, se si desidera che HTML TextField venga modificato ad ogni clic, il clic si verifica nell'applet che dovrebbe essere modificato per attivare l'aggiornamento, come descritto sopra. Senza modificare l'applet, vedo due opzioni. Opzione # 1 utilizza un 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); 
} 

Questo è simile al codice di cui sopra, tranne cliccando su un'area di testo attiva la funzione updateText() che consentirà di definire il valore del campo di testo HTML per il valore del campo di testo Applet looping ogni 50ms. Ciò introdurrà potenzialmente un lieve ritardo tra il clic e l'aggiornamento, ma sarà limitato. È possibile aumentare la frequenza del timer, ma ciò contribuirà a ridurre le prestazioni. Non vedo dove hai nascosto l'applet, ma la stessa funzione dovrebbe chiamare stopUpdating in modo che non stiamo più provando a contattare un'applet nascosta.

Opzione # 2 (non codificato)

mi sarebbe quello di cercare di catturare lo scatto nel Applet come bolle attraverso l'HTML DOM. Quindi, è possibile saltare il timer e inserire un comportamento click() nel contenitore di applet per fare lo stesso aggiornamento. Non sono sicuro che se tali eventi bolla, quindi, non sono sicuro se questo potrebbe funzionare. Anche se così fosse, non sono sicuro di quanto sarebbe compatibile con i browser.

Opzione # 3

terza opzione è quella di non aggiornare il campo di testo HTML su ogni clic. Questo sarebbe semplicemente una combinazione di Kyle e dei miei post sopra per impostare il valore del campo di testo ogni volta che finisci con l'applet.

+0

Ciao jrookover. Grazie per l'elaborata risposta. Vedendo il tuo post, ho aggiornato la mia domanda fornendo maggiori informazioni sul codice dell'applet e alcuni dei miei risultati. Sarebbe suppry di te se potessi raccomandare le modifiche richieste nel file jQuery in questa fase. – Cipher

+0

Al lavoro ora, ma pubblicherò un aggiornamento più tardi questa sera. Probabilmente funzionerà con il timeout di JavaScript che ho suggerito. L'unico problema è che esiste un equilibrio tra la reattività (cioè il ping costante per gli aggiornamenti) e le prestazioni (ad esempio il ping costante è un esaurimento delle risorse). L'implementazione * migliore * sarebbe quella di modificare il codice dell'applet per rispondere all'evento Click. Anche se mi chiedo se tali eventi possano esplodere attraverso il DOM? – jbrookover

+0

@jbrookover: posso contattarmi per email su questa roba? Bloccato da un tempo di attesa. Basta chiedere un piccolo aiuto, per favore. : - | – Cipher

1

This page spiega come manipolare DOM da un'applet Java. Per trovare l'elemento di input, chiama semplicemente la funzione document.getElementById (id) con id di un attributo id della casella di immissione del testo.

4

Ecco una possibile soluzione. Per ottenere il testo all'interno della casella di testo Java, scrivere un metodo getter nella Applet per recuperare il testo:

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

Nel codice JQuery, aggiungere le seguenti righe:

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

ho trovato più di quello che ho postato sopra here. Spero che questo ti aiuti.

Problemi correlati