【问题标题】:Add file filters to JavaFx Filechooser in Jython and parametrize them将文件过滤器添加到 Jython 中的 JavaFx Filechooser 并对其进行参数化
【发布时间】:2020-09-14 09:02:18
【问题描述】:

我在 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

我还尝试将过滤器转换为列表并将过滤器插入列表,但错误仍然存​​在。

我做错了什么,我该怎么办?
提前致谢。

【问题讨论】:

    标签: java python javafx jython


    【解决方案1】:

    您可以使用向量来解析您的 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 进行了测试

    【讨论】:

    • 早上好,米歇尔!对不起,如果我回答你晚了,但正如你所知,程序员的工作是毫无生气的! ? 谢谢你的回答很全面,但是我想知道3件事,如果你至少告诉我前两个,我会给你剩下的奖励:1)如何打开浏览器特定文件夹; 2)如何返回浏览文件以用于代码的其他部分; 3)如何将该过滤器列表作为类/方法的参数。提前致谢!
    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 2013-02-15
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多