Python has two syntaxes for calling a method on an instance:

a)  theInstance.theMethod(args),  or
b)  TheClass.theMethod(theInstance,args)

You found the ambiguity between Component.getName(aComponent) and theClassInstance.getName().
Since you are trying to call a method on a Class, it prefers syntax b, but you intended
syntax a.  You can force it to call Class.getName by using syntax b yourself:

java.lang.Class.getName(e.getComponent().getClass())




On 9/27/2012 5:19 AM, Bob Gibson wrote:

  I ran into something today that frustrates me, and I'm hoping that someone
might be able to help me understand if I am making a mistake, or if by some
chance I've stumbled upon a bug.

  While working with Jython Swing applications, I encountered something that I
couldn't explain.  Some of the Java Swing Tutorial applications use the
following expression to get the name of object.  For example, one example can be
found here:

--------------------------------------------------------------------------------
http://docs.oracle.com/javase/tutorial/uiswing/examples/events/ComponentEventDemoProject/src/events/ComponentEventDemo.java
--------------------------------------------------------------------------------

  All of the ComponentListener methods use the following expression to obtain
the name of the component for which an event was generated:

e.getComponent().getClass().getName()

  In case you are interested, the source code for the componentHidden method is:

--------------------------------------------------------------------------------
public void componentHidden(ComponentEvent e) {
    displayMessage(e.getComponent().getClass().getName() + " --- Hidden");
}
--------------------------------------------------------------------------------

  Unfortunately, when I try to use this same technique in Jython, the following
error message is generated:

--------------------------------------------------------------------------------
TypeError: getName(): expected 1 args; got 0
--------------------------------------------------------------------------------

  The really strange thing about this is that the only getName method that I can
find in the class hierarchy is the one in java.awt.Component and it doesn't
expect any arguments:

--------------------------------------------------------------------------------
http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#getName%28%29
--------------------------------------------------------------------------------

  I was able to work around this, but it is still something that bugs me because
I don't understand what is happening.

  Can anyone explain why I'm getting this error?

  Here is a small script (with line numbers) to demonstrate the error:

 1|#-------------------------------------------------------------------------------
 2|# Command: possibleBug
 3|# Purpose: Jython script to demonstrate strange behavior / possible bug with
 4|#          Swing applications
 5|#   Usage: jython possibleBug.py
 6|#-------------------------------------------------------------------------------
 7|
 8|import java
 9|import sys
10|from   java.awt    import EventQueue
11|from   javax.swing import JButton
12|from   javax.swing import JFrame
13|
14|#-------------------------------------------------------------------------------
15|# Name: possibleBug()
16|# Role: Jython Swing application class used to demonstrate the issue being seen.
17|# Note: This class should be instantiated on the Swing Event Dispatch Thread
18|#-------------------------------------------------------------------------------
19|class possibleBug( java.lang.Runnable ) :
20|
21|    #---------------------------------------------------------------------------
22|    # Name: run()
23|    # Role: Create a frame containing a single button
24|    # Note: Invoked by the Swing Event Dispatch Thread
25|    #---------------------------------------------------------------------------
26|    def run( self ) :
27|        frame = JFrame(
28|            'possibleBug',
29|            locationRelativeTo = None,
30|            defaultCloseOperation = JFrame.EXIT_ON_CLOSE
31|        )
32|        frame.add(
33|            JButton(
34|                'Press',
35|                actionPerformed = self.pressed
36|            )
37|        )
38|        frame.pack()
39|        frame.setVisible( 1 )
40|
41|    #---------------------------------------------------------------------------
42|    # Name: pressed()
43|    # Role: Used as button ActionListener.actionPerformed() event handler
44|    #---------------------------------------------------------------------------
45|    def pressed( self, event ) :
46|#       print ' event:', event
47|#       print 'Source:', event.getSource()
48|#       print ' class:', event.getSource().getClass()
49|        print '  name:', event.getSource().getClass().getName()
50|
51|#-------------------------------------------------------------------------------
52|#  Name: anonymous
53|#  Role: Verify that the script was executed, and not imported and instantiate
54|#        the user application class on the Swing Event Dispatch Thread
55|#-------------------------------------------------------------------------------
56|if __name__ in [ '__main__', 'main' ] :
57|    EventQueue.invokeLater( possibleBug() )
58|else :
59|    print '\nError: This script should be executed, not imported.\n'
60|    print 'Usage: jython %s.py' % __name__
61|    sys.exit()

  When I execute the script, and press the button, the following exception can
be seen:

--------------------------------------------------------------------------------
  name:Exception in thread "AWT-EventQueue-0"
Traceback (most recent call last):
  File "possibleBug.py", line 49, in pressed
    print '  name:', event.getSource().getClass().getName()
TypeError: getName(): expected 1 args; got 0
--------------------------------------------------------------------------------

  I'm using Jython 2.5.3:

--------------------------------------------------------------------------------
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:48:36)
[IBM J9 VM (IBM Corporation)] on java1.6.0
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.version
2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:48:36)
[IBM J9 VM (IBM Corporation)]
>>> print sys.version_info
(2, 5, 3, 'final', 0)
>>> quit()
--------------------------------------------------------------------------------

Thanks
Bob


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://ad.doubleclick.net/clk;258768047;13503038;j?
http://info.appdynamics.com/FreeJavaPerformanceDownload.html


_______________________________________________
Jython-users mailing list
Jython-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jython-users