Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    32

    [java] Comunicazione tra applet e Javascript

    Salve a tutti. Il mio problema è abbastanza complicato comunque provo a farmi capire.

    ho inserito in una pagina web un'applet chiamata MapListener il cui codice sorgente è il seguente:

    import javax.swing.*;
    import java.applet.*;
    import java.awt.*;
    import java.awt.event.*;
    import netscape.javascript.*;
    import java.lang.Object.*;

    public class MapListener extends JApplet implements MouseListener {
    public int mx, my; // the mouse coordinates
    private JSObject mapWin;
    public String [] args;

    public void init() {
    mx = 0; my = 0;
    args = new String[2];
    //Register for mouse events on blankArea and applet.
    addMouseListener(this);
    mapWin = JSObject.getWindow(this);
    }

    public void mousePressed(MouseEvent e) { }
    public void mouseReleased(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) { }
    public void mouseExited(MouseEvent e) { }
    public void mouseClicked(MouseEvent e) {
    mx = e.getX();
    my = e.getY();

    args[0] = Integer.toString(mx);
    args[1] = Integer.toString(my);
    mapWin.call("appletXY2WorldCoords", args);

    }
    public int getX() {
    return mx;
    }
    public int getY() {
    return my;
    }
    public void clearCoordinates() {
    mx = 0; my = 0;
    }
    }

    All'interno della pagina che contiene l'applet ho inserito le funzioni javascript:

    // convert retreived x, y coordinates into map units.
    function appletXY2WorldCoords (x,y) {
    var imsMap = parent.mapFrame.IMSMap;
    var currentExtent = parent.mapFrame.document.IMSMap.getExtent();
    var EnvelopeWidth = currentExtent.getXMax() - currentExtent.getXMin();
    var EnvelopeHeight = currentExtent.getYMax() - currentExtent.getYMin();

    var mapFrameWidth = parent.mapFrame.document.body.clientWidth;
    var mapFrameHeight = parent.mapFrame.document.body.clientHeight;
    var intX = parseInt(x);
    var intY = parseInt(y);

    var PointWorldX = intX / mapFrameWidth * EnvelopeWidth + currentExtent.getXMin();
    var PointWorldY = (mapFrameHeight - intY) / mapFrameHeight * EnvelopeHeight + currentExtent.getYMin();


    theLabel = selectByCircle(PointWorldX, PointWorldY, 0.0001);

    imsMap.createAcetateLayer();
    imsMap.addLabel(theLabel, PointWorldX, PointWorldY);

    //alert(PointWorldX + ',' + PointWorldY);
    }


    // select features within a radius of x,y
    function selectByCircle(inX,inY,theRadius) {
    //if (checkSelectedLayer()) {
    var layer = parent.mapFrame.IMSMap.getSelectedLayer();

    var result = layer.selectByCircle(inX,inY,theRadius);

    //if (useJavaAttributeDisplay) {
    // displayAttributesUI();
    //} else {
    var labelValue = showSelect("");
    layer.clearSelection();

    return labelValue;
    //}
    //}

    }



    // show selected feature's name value
    function showSelect(returnString) {

    var anyLayer;
    var layerName = "";
    var msgString = "";

    anyLayer = parent.mapFrame.IMSMap.getSelectedLayer();
    if (anyLayer != null) {
    if (returnString=="") returnString = parent.mapFrame.IMSMap.getSelectedLayer().getSelec tionSet();
    layerName = anyLayer.getName();
    var bigString = new String(returnString);
    if (bigString == "") {
    msgString = parent.msgList[10] + layerName;
    alert(msgString);
    }
    else {
    var theList = bigString.split("|");
    var numRecs = theList.length - 1;
    var theFields = theList[0].split("::");
    var numFields = theFields.length;
    var thisValue = "";

    theValues = theList[1].split("::");
    for (var j=1;j < theFields.length; j++) {
    if (theFields[j].toUpperCase() == "NAME"){
    thisValue = theValues[j];
    return thisValue;
    }
    }

    }
    }
    else {
    msgString = parent.msgList[9];
    alert(msgString);
    }

    }

    e le altre due funzioni per la gestione del mouse:

    // activate mouselistener
    function activateMouseListener(){
    var myApplet = parent.mapFrame.document.MapListener;
    if (myApplet != null){
    parent.mapFrame.IMSMap.getGlassPane().addMouseList ener(myApplet);
    parent.mapFrame.IMSMap.getGlassPane().show();
    } else{
    alert("MapListener applet desn't exists.");
    }
    }

    // deactivate the mouselistener
    function deactivateMouseListener(){
    var myApplet = parent.mapFrame.document.MapListener;
    if (myApplet != null){
    parent.mapFrame.IMSMap.getGlassPane().removeMouseL istener(myApplet);
    parent.mapFrame.IMSMap.getGlassPane().hide();
    //else{
    //alert("MapListener applet desn't exists.");
    }
    }

    In pratica, quando eseguo l'istruzione parent.mapFrame.IMSMap.getGlassPane().addMouseList ener(myApplet); ottengo un errore di scripting di non corrispondenza di tipo.Per quale motivo? Forse è sbagliato il parametro passato?
    MapListener.class l'ho ottenuta compilando con jdk 1.4.0 (che contiene il package netscape.javascript). C'è qualche cosa che non va nell'interazione tra applet e javascript. Comunque il riferimento MyApplet è preso correttamente. Non so se mi sono espresso bene, sono penalizzato da una scarsa conoscenza di Java (il codice è preso, copiato ed incollato da un forum americano). Per chi lavora con gli ambienti GIS della ESRI come me, sto apportando modifiche al Java Viewer di ArcIMS per cercare di personalizzare un po' di più.
    Grazie a quanti mi vorranno aiutare.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    32
    Aggiungo qualche altro particolare:

    la pagina contiene due applet: una quella aggiunta da me (MapListener) il cui codice sorgente ho fornito, l'altra si chiama IMSMap ed era già presente. Le due applet dovrebbero interagire, nel senso che MapListern dovrebbe essere satellite di IMSMap,intercettando l'evento di click con il mouse e trasformando le coordinate in pixel in coordinate geografiche (vedi la chiamata interna a MapListener alla funzione javascript appletXY2WorldCoords, che utilizza internamente dei metodi esportati da IMSMap.
    Non dubito del corretto funzionamento di IMSMap perché non lo inventata io, ma ho paura di aver introdotto del caos quando ho messo in mezzo l'altra applet. Forse è MapListener non risponde bene al Javascript?

    Grazie ancora e scusate la poca chiarezza.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.