Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.
Hi, I have written DisplaySezioneGeo, a class much like the simpler 2-D display examples. Another class generates some JInternalFrame's, and I use method getComponent() in DisplaySezioneGeo to show on a JPanel the corresponding data. However, it works only at the first instantiation of DisplaySezioneGeo. I have put the RealType's and FunctionType's as static because otherwise I got an exception when defining them more than once. Every time I try to use more than one DisplaySezioneGeo at a time, the additional plots don't appear on Monitor. I get non exception message, also the JComponent returned by getComponent is not null. I copy the class below, because I don't understand what could be irrelevant; I hope I do not break the list's netiquette. Thanks, Francesco import visad.*; import visad.java2d.*; import java.rmi.RemoteException; import java.awt.*; import javax.swing.*; import java.util.Date; public class DisplaySezioneGeo extends Object { /*Variabili connesse al resto di IdroMonitor */ protected Stazione sta = null; //aggiornamento piu' recente di questo oggetto protected Date ultimoAggiornamento = null; /*variabili interne non VisaD */ //true se l'oggetto puo' fornire il grafico di una vera sezione boolean status = false; /*Variabili strettamente VisaD */ //non necessitano dai dati concreti per essere costruiti protected static RealType larghezza; protected static RealType altezza; protected static RealType indice; protected static RealTupleType l_a_tuple; protected static FunctionType func_i_tuple; protected static FunctionType func_l_a; protected DisplayImpl display; protected ScalarMap larghezzaMap, altezzaMap; //necessitano dai dati concreti per essere costruiti protected Set larghezza_set; protected FlatField vals_ff; protected DataReferenceImpl data_ref; //Le quantita' per i livelli: [3] e' il livello dell'acqua, [0,1,2] sono nell'ordine gli allarmi protected Set[] lvl_set = new Set[4]; protected FlatField[] lvl_ff = new FlatField[4]; protected DataReferenceImpl[] lvl_ref = new DataReferenceImpl[4]; /* Crea l'oggetto in modo da poterlo avere e inizializza alcune variabili VisaD indipendenti dai dati effettivi. */ public DisplaySezioneGeo() throws visad.VisADException, java.rmi.RemoteException { //Eseguito solo la prima volta if(larghezza == null) { larghezza = new RealType("larghezza", SI.meter, null); altezza = new RealType("altezza", SI.meter, null); indice = new RealType("indice"); l_a_tuple = new RealTupleType( larghezza, altezza); func_i_tuple = new FunctionType(indice, l_a_tuple); func_l_a = new FunctionType(larghezza, altezza); } display = new DisplayImplJ2D("display1"); //Rapporto tra le dimensioni degli assi try { display.getProjectionControl().setAspect(new double[] {1.35, 1.0}); } catch (VisADException exc) {} catch (RemoteException exc) {} GraphicsModeControl dispGMC = (GraphicsModeControl) display.getGraphicsModeControl(); dispGMC.setScaleEnable(true); dispGMC.setPointMode(false); dispGMC.setLineWidth(1.5f); DisplayRenderer dispR = (DisplayRendererJ2D) display.getDisplayRenderer(); dispR.setBackgroundColor(0.8f, 0.8f, 0.8f); dispR.setCursorColor(0.f, 0.f, 0.f); larghezzaMap = new ScalarMap( larghezza, Display.XAxis ); altezzaMap = new ScalarMap( altezza, Display.YAxis ); display.addMap(larghezzaMap); display.addMap(altezzaMap); } //aggiorna i dati da mostrare sulla sezione public void aggiorna() { if(ultimoAggiornamento == null || ultimoAggiornamento.before(sta.ultimaLettura)) { /*Il livello dell'acqua: deve essere preparato ad ogni aggiornamento */ double[] dadum sta.sezione.getIntersezioni(sta.strumenti[sta.inUso.posizione].livello); float[][] p = new float[1][2]; //Tolgo il dato precedente try { if(lvl_ref[3] != null) display.removeReference(lvl_ref[3]); } catch(visad.VisADException e) { status = false; return; } catch(java.rmi.RemoteException e) { status = false; return; } if(dadum == null) { p[0][0] = (float)sta.sezione.xmin; p[0][1] = (float)sta.sezione.xmax; } else { p[0][0] = (float) dadum[0]; p[0][1] = (float) dadum[dadum.length - 1]; } try { lvl_set[3] = new Irregular1DSet(larghezza, p); lvl_ff[3] = new FlatField(func_l_a, lvl_set[3]); p[0][0] = (float)sta.strumenti[sta.inUso.posizione].livello; p[0][1] = (float)sta.strumenti[sta.inUso.posizione].livello; lvl_ff[3].setSamples(p); lvl_ref[3] = new DataReferenceImpl("Livello"); lvl_ref[3].setData( lvl_ff[3] ); ConstantMap[] lvlCMap = { new ConstantMap( 0.f, Display.Red ), new ConstantMap( 0.f, Display.Green ), new ConstantMap( 1.f, Display.Blue ), new ConstantMap( 2.0f, Display.LineWidth ) }; display.addReference( lvl_ref[3], lvlCMap); } catch(visad.VisADException e) { status = false; return; } catch(java.rmi.RemoteException e) { status = false; return; } } } //restituisce, se esiste, una JComponent con l'aspetto del grafico della sezione public JComponent getComponent() { if(status) return (JComponent)display.getComponent(); else return null; } public boolean getStatus() { return status; } // Prepara il display della sezione; a preparare il livello ci pensa aggiorna() public void setStazione(Stazione s) { status = true; if(sta != s) { sta = s; if(sta == null) { status = false; return; } else { SezioneGeo g = sta.sezione; double[][] punti = g.getPunti(); if(punti == null) { status = false; return; } else if(punti.length == 2 && punti[0].length > 0) { try { //disegna la sezione float[][] p = new float[1][punti[0].length]; for(int i=0; i<punti[0].length; i++) p[0][i] = (float)punti[0][i]; larghezza_set = new Irregular1DSet(larghezza, p); vals_ff = new FlatField(func_l_a, larghezza_set); for(int i=0; i<punti[0].length; i++) p[0][i] = (float)punti[1][i]; vals_ff.setSamples(p); data_ref = new DataReferenceImpl("data_ref"); data_ref.setData( vals_ff ); ConstantMap[] sezCMap = { new ConstantMap( 0.4f, Display.Red ), new ConstantMap( 0.2f, Display.Green ), new ConstantMap( 0.2f, Display.Blue ), new ConstantMap( 2.0f, Display.LineWidth ) }; display.addReference( data_ref, sezCMap); //disegna i livelli di allarme p = new float[1][2]; //Definizione sintetica dei colori float[][] col = {{0.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}}; //ciclo sui livelli di allarme for(int k=0; k<3; k++) { double[] dadum = g.getIntersezioni(sta.allarmi[k]); p[0][0] = (float)dadum[0]; p[0][1] = (float)dadum[dadum.length-1]; lvl_set[k] = new Irregular1DSet(larghezza, p); lvl_ff[k] = new FlatField(func_l_a, lvl_set[k]); p[0][0] = (float)s.allarmi[k]; p[0][1] = (float)s.allarmi[k]; lvl_ff[k].setSamples(p); lvl_ref[k] = new DataReferenceImpl("Allarme_ref_"+String.valueOf(k)); lvl_ref[k].setData( lvl_ff[k] ); ConstantMap[] lvlCMap = { new ConstantMap( col[k][0], Display.Red ), new ConstantMap( col[k][1], Display.Green ), new ConstantMap( col[k][2], Display.Blue ), new ConstantMap( 1.0f, Display.LineWidth ) }; display.addReference( lvl_ref[k], lvlCMap); } } catch(visad.VisADException e) { status = false; System.out.println("Aho! Eccezio2"); return; } catch(java.rmi.RemoteException e) { status = false; return; } } else { status = false; return; } } } } }
visad
archives: