【问题标题】:Can methods in Jython return Java objects?Jython 中的方法可以返回 Java 对象吗?
【发布时间】:2014-05-06 19:54:43
【问题描述】:

我正在使用 Marathon 测试 Java Swing 应用程序。使用 Jython 的 Java Swing 应用程序测试工具。在这个问题的整个范围内,我只关心两个 python 文件。

调用文件.py:

    testObject = getParentOfFooJPanel(get_component('...'))
    print(testObject.getClass().getSimpleName()) #this is only here for testing
                                                 #if my code works, but this is
                                                 #where I get the errors

FileWithMethod.py

    def getParentOfFooJPanel(startingComponent):
        if (startingComponent.getClass().getSimpleName() == 'FooJPanel')

            print(startingComponent.getClass().getSimpleName()) #prints what I would expect
            print(startingComponent.getParent().getClass().getSimpleName()) #prints what I would expect
            return(startingComponent.getParent())

        else:

            getParentOfFooJPanel(startingComponent.getParent())

每当我尝试在 FileWithMethod.py 中引用该对象时,它的行为都符合我的预期。但是,当我返回组件(Java 对象)并尝试在 CallingFile.py 中使用它(现在我调用以打印简单名称)时,它说“NoneType”对象没有属性“getClass”。 Jython 不能返回 Java 对象吗?如果没有,有什么解决办法吗?

【问题讨论】:

  • 不确定,但您可能需要返回以递归调用 getParentOfFooJPanel。

标签: java swing jython


【解决方案1】:

Jython 绝对可以返回 Java 对象。下面是一个返回对象的例子。

您的错误很可能意味着您的代码中的其他错误正在返回 None

调用文件.py:

from FileWithMethod import getStringReader
testObject = getStringReader("Hello World")
print(type(testObject))

FileWithMethod.py

import java.io.StringReader
def getStringReader(string):
    return java.io.StringReader(string)

运行它:

$ jython CallingFile.py
<type 'java.io.StringReader'>

【讨论】:

  • 我已将 return startingComponent.getParent() 替换为 return java.awt.Component(startingComponent.getParent(),但现在我收到错误 no visible constructor 因为 java.awt.Component 只有一个构造函数并且它受到保护。我读到您可以告诉 Jython 忽略 Java 可访问性,但我宁愿不这样做,除非我绝对必须这样做。
  • 另外,Component 是一个抽象类,所以我不能真正将它转换为 Component 对象。
  • 我只能回答您的问题:“是的,Jython 方法可以返回 Java 对象”。我不能为你写你的代码;如果你的代码不能返回对象,你需要弄清楚为什么你的代码不能这样做。
  • 我不是要你为我写代码。我只是不明白为什么return startingComponent.getParent() 返回“NoneType”对象,但是当我调用另一个方法(在 FileWithMethod 内部)时,它会像我期望的那样被视为组件对象。如果我不能返回这个东西,但可以将它传递给另一个方法,那么它与不能将对象从一个文件传递到另一个文件有关,这就是我所说的。无论如何,我找到了解决方法。感谢您的 cmets 和时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2015-03-15
  • 2015-08-17
相关资源
最近更新 更多