Dear all:
The attach file is my java demo application. When I press the 'loop' button,
my system's memory is eaten up by it. Could you find the reason? Or how can I
avoid this?
thanks,
Best,
lizhi
##########################################################################
Key Laboratory of Regional Climate-Environment for East Asia,
START/RRC Temperate East Asia, Institute of
Atmospheric Physics, Chinese Academy of Sciences
Tel(O) : 86-10-82995140
Fax(O) : 86-10-82995135
E-mail : wlz@xxxxxxxxx
Address : P.O.Box 9804,Beijing 100029, P.R.China
##########################################################################
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import visad.*;
import visad.util.*;
import visad.java2d.*;
import visad.java3d.*;
import java.rmi.RemoteException;
public class GLayer extends DisplayImplJ3D
{
public GLayer( String name, float[][][][] datas, float[][][] depth )
throws VisADException, RemoteException
{
super( name );
_datas = datas;
_depth = depth;
init();
ContourControl isoControl = (ContourControl)_isomap.getControl();
isoControl.setContourFill( true );
}
public void next()
{
System.err.println( _inx );
_inx ++;
if( _inx >= _datas.length )
_inx = 0;
try
{
update();
}
catch( Exception e )
{
e.printStackTrace();
}
}
private void init()
throws VisADException, RemoteException
{
int NX = _depth[0][0].length;
int NY = _depth[0].length;
int NZ = _depth.length;
RealType x = RealType.getRealType( "X" );
RealType y = RealType.getRealType( "Y" );
RealType z = RealType.getRealType( "Z" );
RealType v = RealType.getRealType( "Value" );
RealType[] time = { RealType.Time };
ScalarMap xmap = new ScalarMap( x, Display.XAxis );
ScalarMap ymap = new ScalarMap( y, Display.YAxis );
ScalarMap zmap = new ScalarMap( z, Display.ZAxis );
_vmap = new ScalarMap( v, Display.RGBA );
_isomap = new ScalarMap( v, Display.IsoContour );
addMap( xmap );
addMap( ymap );
addMap( zmap );
addMap( _vmap );
addMap( _isomap );
/*
xmap.setRange( 0, NX-1 );
ymap.setRange( 0, NY-1 );
zmap.setRange( 0, NZ-1 );
*/
GraphicsModeControl mode = getGraphicsModeControl();
mode.setScaleEnable( true );
mode.setTransparencyMode( DisplayImplJ3D.NICEST );
mode.setTexture3DMode( GraphicsModeControl.TEXTURE3D );
mode.setTextureEnable( true );
DataReferenceImpl baseRef = new DataReferenceImpl( "Baseref" );
addReference( baseRef, null );
RealTupleType domain2dxy = new RealTupleType( x, y );
RealTupleType times = new RealTupleType( time );
Linear2DSet set2d = new Linear2DSet( domain2dxy, 0, NX-1, NX, 0, NY-1, NY
);
Linear1DSet set1d = new Linear1DSet( times, 0, NZ-1, NZ );
FunctionType f2d = new FunctionType( domain2dxy, new RealTupleType( z, v
) );
FunctionType f1d = new FunctionType( times, f2d );
_f2dData = new FlatField[NZ];
for( int k = 0; k < NZ; k ++ )
_f2dData[k] = new FlatField( f2d, set2d );
_f1dData = new FieldImpl( f1d, set1d );
_samples = new float[NZ][2][NY*NX];
baseRef.setData( _f1dData );
for( int k = 0; k < NZ; k ++ )
for( int j = 0; j < NY; j ++ )
for( int i = 0; i < NX; i ++ )
_samples[k][0][j*NX+i] = _depth[k][j][i];
update();
}
private void update()
throws VisADException, RemoteException
{
float[][][] data = _datas[_inx];
int NX = data[0][0].length;
int NY = data[0].length;
int NZ = data.length;
float min = data[0][0][0];
float max = min;
for( int k = 0; k < NZ; k ++ )
for( int j = 0; j < NY; j ++ )
for( int i = 0; i < NX; i ++ )
{
_samples[k][1][j*NX+i] = data[k][j][i];
if( min > data[k][j][i] ) min = data[k][j][i];
if( max < data[k][j][i] ) max = data[k][j][i];
}
System.err.println( min + " " + max );
_vmap.setRange( min, max );
for( int k = 0; k < NZ; k ++ )
_f2dData[k].setSamples( _samples[k], false );
double[] vrange = _vmap.getRange();
_isomap.setRange( vrange[0], vrange[1] );
for( int k = 0; k < NZ; k ++ )
_f1dData.setSample( k, _f2dData[k] );
}
private int _inx = 0;
private ScalarMap _vmap, _isomap;
private float[][][][] _datas;
private float[][][] _depth;
private float[][][] _samples;
private FlatField[] _f2dData;
private FieldImpl _f1dData;
public static void main( String[] argv ) throws Exception
{
int NX = 25;
int NY = 25;
int NZ = 4;
int TIME = 10;
float[][][][] datas = new float[TIME][NZ][NY][NX];
float[][][] depth = new float[NZ][NY][NX];
for( int k = 0; k < NZ; k ++ )
for( int j = 0; j < NY; j ++ )
for( int i = 0; i < NX; i ++ )
depth[k][j][i] = -( 1000 + 10*k + 5*j + i );
for( int m = 0; m < TIME; m ++ )
for( int k = 0; k < NZ; k ++ )
for( int j = 0; j < NY; j ++ )
for( int i = 0; i < NX; i ++ )
datas[m][k][j][i] = 10*m + k + j + i;
JFrame f = new JFrame();
Container c = f.getContentPane();
c.setLayout( new BorderLayout() );
final GLayer layer = new GLayer( "Layer", datas, depth );
c.add( layer.getComponent(), BorderLayout.CENTER );
final javax.swing.Timer timer = new javax.swing.Timer( 1000, new
AbstractAction()
{
public void actionPerformed( ActionEvent e )
{
layer.next();
}
} );
final JButton loopBtn = new JButton( "loop" );
final JButton stopBtn = new JButton( "stop" );
loopBtn.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
timer.start();
loopBtn.setEnabled( false );
stopBtn.setEnabled( true );
}
} );
stopBtn.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
timer.stop();
loopBtn.setEnabled( true );
stopBtn.setEnabled( false );
}
} );
JPanel p = new JPanel();
p.setLayout( new BoxLayout( p, BoxLayout.X_AXIS ) );
p.add( loopBtn );
p.add( stopBtn );
c.add( p, BorderLayout.PAGE_END );
f.pack();
f.setLocationRelativeTo( null );
f.setVisible( true );
}
} ///:~