问题描述
我在Jython中创建了一个javaFX选择器文件。从Java移植到Jython并不容易,但是最终取得了一些结果。现在,我想对获得的类进行参数化,同时考虑文件过滤器,以便能够使用与过滤文件类型不同的对象进行浏览。
我试图插入固定的过滤器:
import sys
from javafx.application import Application
from javafx.stage import FileChooser,Stage
class filebrowser(Application):
@classmethod
def main(cls,args):
filebrowser.launch(cls,args)
def start(self,primaryStage):
fc = FileChooser()
filter = FileChooser.ExtensionFilter("All Images",'*.jpg')
fc.getExtensionFilters().add(
filter
)
f = fc.showOpenDialog(primaryStage)
if __name__ == '__main__':
filebrowser.main(sys.argv)
Exception in Application start method
Traceback (most recent call last):
File "provaFileChooser.py",line 28,in <module>
filebrowser.main(sys.argv)
File "provaFileChooser.py",line 15,in main
filebrowser.launch(cls,args)
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
at java.lang.Thread.run(UnkNown Source)
Caused by: Traceback (most recent call last):
File "provaFileChooser.py",line 19,in start
filter = FileChooser.ExtensionFilter("JPG Images",'*.jpg')
TypeError: javafx.stage.FileChooser$ExtensionFilter(): 2nd arg can't be coerced to java.util.List,String[]
at org.python.core.Py.TypeError(Py.java:236)
at org.python.core.PyReflectedFunction.throwError(PyReflectedFunction.java:213)
at org.python.core.PyReflectedFunction.throwBadArgError(PyReflectedFunction.java:316)
at org.python.core.PyReflectedFunction.throwError(PyReflectedFunction.java:325)
java.lang.RuntimeException: java.lang.RuntimeException: Exception in Application start method
我还尝试将过滤器转换为列表,并将过滤器插入列表,但错误仍然存在。
我在做什么错,应该怎么办?
预先感谢。
解决方法
您可以使用vector解析扩展类型来解决StackTrace,如下所示:
import sys
from java.io import File
from javafx.application import Application
from javafx.stage import FileChooser,Stage
class FileBrowser(Application):
# I am a class attribute,Im called using NameClass.me
# You have to remember this path is different according to SO
initalDir = File("/home/miolivc/Documents/") # you have to handle this
extensions = ["*.jpg"]
@classmethod
def main(cls,args):
FileBrowser.launch(cls,args)
def start(self,primaryStage):
fc = FileChooser()
filter = FileChooser.ExtensionFilter("All Images",FileBrowser.extensions)
fc.getExtensionFilters().add(filter)
fc.setInitialDirectory(FileBrowser.initalDir)
choosed = fc.showOpenDialog(primaryStage)
print("File: " + str(choosed))
if __name__ == '__main__':
FileBrowser.main(sys.argv)
关于在代码的其他部分使用FileBrowser,您必须了解JavaFX的工作方式,可以在Controller类构造函数中使用file并使用Scene类调用此视图。 FileBrowser正在扩展Application类,这意味着它是您应用程序的根目录,您应该从此应用程序中调用其他人。
要了解更多信息,建议您搜索Scene和FXMLLoader。
我使用Zulu Java FX 11和Jython 2.7.1进行了测试