My component is specified with

<xslider id="sliimg01" initclass="edu.caltech.ipac.spitzer.spice.actions.display.BQDDisplay"/>

The code for XSlider is attached. It is a JSlider that looks for a field named "sliderListener" in initclass, and adds it as a listener if found.

BQDDisplay does have sliderListener defined and has already been instantiated by the time that line is reached, so in BQDDisplay.java,

 public static synchronized BQDDisplay getInstance() {
   if (bqdd==null) {
     bqdd = new BQDDisplay(null);
   }
   return bqdd;
 }

getInstance should just return the singleton reference. This used to work when the constructor for XSlider was

public XSlider (BQDDisplay bqdp) {...}

But when I changed it to

public XSlider (Object bqdp) {...}

swix never calls getInstance because it really feels that bqdp should be of exactly the type specified by initclass. It seems to me that it should be enough that the initclass be a subclass of what is used in XSlider.


As for the classloader problem, I add an array of URLs to the classloader in order to instantiate BQDDisplay:

ucl = URLClassLoader.newInstance(urls, ucl);

because this class is going to be loaded over the network. After the swing engine is created, I give it the new class loader, so it can access getInstance of BQDDisplay:

swix = new SwingEngine(swixclient);
swix.setClassLoader(ucl);

but when it reaches the line in Parser.java

Class initClass = Class.forName( st.nextToken() );

a trace of the code shows that Parser is not actually using ucl from the setClassLoader call. At that point it throws a ClassNotFound exception.

Ted Hesselroth



[EMAIL PROTECTED] wrote:

Hello Ted,

may you send more code snippets reproducing the problem? Perhaps
it is a classpath problem?

The lines checking the constructor parameter types for Object
identiy I currently do not understand -- I'm sure there is a reason
for this ;) Your code looks much more "purposeful".

As far as I understood it, you have such a getInstance method:
public static Object getInstance() {
...
}
The object returned is no Object alone, and the constructor of
the component invoked is determined through swixml?
Sounds like a reasonable thing to do...

Yours,

Frank

List for Users of Carlsbad Cubes' Technologies and Products schrieb am 03.09.04 
07:41:21:
Trying setClassLoader in SwingEngine, I could not get it to work until changing the Class.forName line|| in Parser.java

Class initClass = Class.forName( classname , true, this.engine.getClassLoader() ); // load update type

--kept getting ClassNotFoundException there. It looks like the classloader "cl" field is not getting fully propagated.


Also, I have a custom component using initclass. The component takes an Object argrument in its constructor. It wouldn't initialize until I changed the argument checking in DefaultFactory.java

        for (int j = 0; ctor != null && j < cParams.length; j++) {
          //if (cParams[j].equals( Object.class )) {
          // if (!cParams[j].equals( pTypes[j] )) {
          //   ctor = null; //dismissed
          //  }
          //} else {
            if (!cParams[j].isAssignableFrom( pTypes[j] )) {
              ctor = null; //dismissed
            }
          //}
        } // end for j - loop Ctor's parameter

I am using the getInstance of initclass to aquire an already-instantiated singleton, but my custom component doesn't know or need to know the type. That's why I'm giving it a subclass of Object even though it takes Object. Only the method isAssignableFrom is needed, because it also includes the "equals" case.

By the way, I'll be giving a talk including SWIX in the upcoming ADASS conference on astronomical data reduction, and just yesterday my application using SWIX was released, see

http://ssc.spitzer.caltech.edu/postbcd/spice.html

Ted Hesselroth


_______________________________________________
Forum mailing list
[email protected]
http://carlsbadcubes.com/mailman/listinfo/forum_carlsbadcubes.com




package edu.caltech.ipac.spitzer.capri.util.components;

import javax.swing.*;
import javax.swing.event.*;

public class XSlider extends JSlider {


  public XSlider (Object bqdp) {
    super();

    Object obj = bqdp;

    try {
      Object lo = obj.getClass().getField("sliderListener").get(obj);
      if(lo instanceof ChangeListener) {
      super.addChangeListener((ChangeListener) lo);
    }
    } catch (NoSuchFieldException e) {
      //System.out.println("Could not set action for slider -no such field");
    } catch (IllegalAccessException ia) {
      //System.out.println("Could not set action for slider -illegal access");
    }

  }

  public void fireStateChanged() {
    super.fireStateChanged();
  }
}

Reply via email to