将文件过滤器添加到Jython中的JavaFx Filechooser并将其参数化

问题描述

我在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进行了测试