Oh where did my MouseEvents go?


I am trying to intercept MouseEvents from a JFrame containing a VisAD graph by registering a MouseListener on the glass pane. The problem is that I can't seem to get the glass pane to intercept the events with a VisAD graph in the frame. It does however work with other components. After doing some investigating, using the example P2_01 code provided by Ugo Taddei, it seems to only seems to malfunction with the DisplayImplJ3D, which is what I'm using. I can get the MouseEvents by adding the below code, but not when I change the display to DisplayImplJ3D.

    jframe.getGlassPane().addMouseListener( new MouseAdapter(){
        public void mouseClicked( MouseEvent evt ){
            System.out.println("MOUSE CLICKED");
        }
    });
    jframe.getGlassPane().setVisible(true);

Any idea how to get MouseEvents using DisplayImplJ3D?

I included both sources with P2_01.java containing the 3D display

Thanks
Bruce
/*
VisAD Tutorial
Copyright (C) 2000 Ugo Taddei
*/


// Import needed classes

import visad.*;
import visad.java2d.DisplayImplJ2D;
import java.rmi.RemoteException;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

/**
  Enhanced version of program P1_01.
  Draw function height = 45 - 5 * time^2
  Rename RealTypes and attach units to them.
  Draw scales on display to show the RealTypes names.
  Run program with java P2_01
 */


public class P2_01{

  // Declare variables
  // The quantities to be displayed in x- and y-axes

  private RealType time, height;


  // The function height = f( time ), represented by ( time -> height )

  private FunctionType func_t_h;


  // Our Data values for time are represented by the set

  private Set time_set;


  // The Data class FlatField, which will hold time and height data.
  // time data are implicitely given by the Set time_set

  private FlatField h_vals_ff;


  // The DataReference from the data to display

  private DataReferenceImpl data_ref;


  // The 2D display, and its the maps

  private DisplayImpl display;
  private ScalarMap timeMap, heightMap;

  // The conctructor for our example class

  public P2_01 (String []args)
    throws RemoteException, VisADException {

    // Create the quantities
    // time and height are measured in SI seconds and SI meters, respectively
    // Use RealType(String name, Unit u,  Set set), set is null

    time = RealType.getRealType("time", SI.second, null);
    height = RealType.getRealType("height", SI.meter, null);


    // Create a FunctionType, that is the class which represents the function
    // height = f(time), that is the MathType ( time -> height )
    // Use FunctionType(MathType domain, MathType range)

    func_t_h = new FunctionType(time, height);


    // These are our actual data values

    // Create the time_set, with 5 integer values, ranging from 0 to 4.
    // That means, that there should be 5 values for height.
    // Use Integer1DSet(MathType type, int length)

    time_set = new Integer1DSet(time, 5);

    // ...the height values

    float[][] h_vals = new float[][]{{0.0f, 33.75f, 45.0f, 33.75f, 0.0f,} };


    // Create a FlatField, that is the class for the samples
    // Use FlatField(FunctionType type, Set domain_set)

    h_vals_ff = new FlatField( func_t_h, time_set);


    // and put the height values above in it

    h_vals_ff.setSamples( h_vals );


    // Create Display and its maps

    // A 2D display

    display = new DisplayImplJ2D("display1");

    // Get display's graphics mode control and draw scales

    GraphicsModeControl dispGMC = (GraphicsModeControl) 
display.getGraphicsModeControl();
    dispGMC.setScaleEnable(true);


    // Create the ScalarMaps: quantity time is to be displayed along XAxis
    // and height along YAxis
    // Use ScalarMap(ScalarType scalar, DisplayRealType display_scalar)

    timeMap = new ScalarMap( time, Display.XAxis );
    heightMap = new ScalarMap( height, Display.YAxis );


    // Add maps to display

    display.addMap( timeMap );
    display.addMap( heightMap );


    // Create a data reference and set the FlatField as our data

    data_ref = new DataReferenceImpl("data_ref");

    data_ref.setData( h_vals_ff );


    // Add reference to display

    display.addReference( data_ref );


    // Create application window, put display into it

    JFrame jframe = new JFrame("My second VisAD application");
    jframe.getContentPane().add(display.getComponent());
    jframe.getGlassPane().addMouseListener( new MouseAdapter(){
      public void mouseClicked( MouseEvent evt ){
        System.out.println("MOUSE CLICKED");
      }
    });
    jframe.getGlassPane().setVisible(true);

    // Set window size and make it visible

    jframe.setSize(300, 300);
    jframe.setVisible(true);

  }


  public static void main(String[] args)
    throws RemoteException, VisADException
  {
    new P2_01(args);
  }

}
/*
VisAD Tutorial
Copyright (C) 2000 Ugo Taddei
*/


// Import needed classes

import visad.*;
import visad.java3d.DisplayImplJ3D;
import java.rmi.RemoteException;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

/**
  Enhanced version of program P1_01.
  Draw function height = 45 - 5 * time^2
  Rename RealTypes and attach units to them.
  Draw scales on display to show the RealTypes names.
  Run program with java P2_01
 */


public class P2_01a{

  // Declare variables
  // The quantities to be displayed in x- and y-axes

  private RealType time, height;


  // The function height = f( time ), represented by ( time -> height )

  private FunctionType func_t_h;


  // Our Data values for time are represented by the set

  private Set time_set;


  // The Data class FlatField, which will hold time and height data.
  // time data are implicitely given by the Set time_set

  private FlatField h_vals_ff;


  // The DataReference from the data to display

  private DataReferenceImpl data_ref;


  // The 2D display, and its the maps

  private DisplayImpl display;
  private ScalarMap timeMap, heightMap;

  // The conctructor for our example class

  public P2_01a (String []args)
    throws RemoteException, VisADException {

    // Create the quantities
    // time and height are measured in SI seconds and SI meters, respectively
    // Use RealType(String name, Unit u,  Set set), set is null

    time = RealType.getRealType("time", SI.second, null);
    height = RealType.getRealType("height", SI.meter, null);


    // Create a FunctionType, that is the class which represents the function
    // height = f(time), that is the MathType ( time -> height )
    // Use FunctionType(MathType domain, MathType range)

    func_t_h = new FunctionType(time, height);


    // These are our actual data values

    // Create the time_set, with 5 integer values, ranging from 0 to 4.
    // That means, that there should be 5 values for height.
    // Use Integer1DSet(MathType type, int length)

    time_set = new Integer1DSet(time, 5);

    // ...the height values

    float[][] h_vals = new float[][]{{0.0f, 33.75f, 45.0f, 33.75f, 0.0f,} };


    // Create a FlatField, that is the class for the samples
    // Use FlatField(FunctionType type, Set domain_set)

    h_vals_ff = new FlatField( func_t_h, time_set);


    // and put the height values above in it

    h_vals_ff.setSamples( h_vals );


    // Create Display and its maps

    // A 2D display

    display = new DisplayImplJ3D("display1");

    // Get display's graphics mode control and draw scales

    GraphicsModeControl dispGMC = (GraphicsModeControl) 
display.getGraphicsModeControl();
    dispGMC.setScaleEnable(true);


    // Create the ScalarMaps: quantity time is to be displayed along XAxis
    // and height along YAxis
    // Use ScalarMap(ScalarType scalar, DisplayRealType display_scalar)

    timeMap = new ScalarMap( time, Display.XAxis );
    heightMap = new ScalarMap( height, Display.YAxis );


    // Add maps to display

    display.addMap( timeMap );
    display.addMap( heightMap );


    // Create a data reference and set the FlatField as our data

    data_ref = new DataReferenceImpl("data_ref");

    data_ref.setData( h_vals_ff );


    // Add reference to display

    display.addReference( data_ref );


    // Create application window, put display into it

    JFrame jframe = new JFrame("My second VisAD application");
    jframe.getContentPane().add(display.getComponent());
    jframe.getGlassPane().addMouseListener( new MouseAdapter(){
      public void mouseClicked( MouseEvent evt ){
        System.out.println("MOUSE CLICKED");
      }
    });
    jframe.getGlassPane().setVisible(true);

    // Set window size and make it visible

    jframe.setSize(300, 300);
    jframe.setVisible(true);

  }


  public static void main(String[] args)
    throws RemoteException, VisADException
  {
    new P2_01a(args);
  }

}