为什么需要特定的Spring FXML Loader

时间:2012-12-12 10:57:16

标签: spring javafx-2 fxml

我正在看这个例子:Building Applications in JavaFX 2.0他们展示了一个自定义的SpringFxmlLoader:

import java.io.IOException;
import java.io.InputStream;
import javafx.fxml.FXMLLoader;
import org.springframework.context.ApplicationContext;
public class SpringFxmlLoader
{
private ApplicationContext context;

public SpringFxmlLoader(ApplicationContext context)
{
    this.context = context;
}

public Object load(String url, Class<?> controllerClass) throws IOException
{
    InputStream fxmlStream = null;
    try
    {
        fxmlStream = controllerClass.getResourceAsStream(url);
        Object instance = context.getBean(controllerClass);
        FXMLLoader loader = new FXMLLoader();
        loader.getNamespace().put("controller", instance);
        return loader.load(fxmlStream);
    }
    finally
    {
        if (fxmlStream != null)
        {
            fxmlStream.close();
        }
    }
}
}`

为什么需要创建一个特定的弹簧FXML Loader?我的意思是,即使使用简单的fxml加载器,当你加载这样的fxml:

无论如何

AnchorPane page = (AnchorPane) FXMLLoader.load(TabePaneGraph.class.getResource("Sample.fxml"));调用样本控制器,任何初始化仍然完成。我试图了解这个特定的自定义SpringFxmlLoader实现背后的动机。

2 个答案:

答案 0 :(得分:1)

有(至少)2种方法,如何指定控制器:

  • 在FXML文件中声明控制器类:请注意您指定 这个类不是这里的实例。 FXMLoader将创建一个新的 实例
  • 将现有实例(例如“this”或此处用Spring实例化的bean)作为控制器传递给FXMLLoader
loader.getNamespace().put("controller", instance);

我不确定这部分,但我认为它可以在最新的JavaFX版本中替换为setController()

答案 1 :(得分:1)

皮肤猫有多种方法。我猜测在该文章中使用spring的动机是因为许多Web开发人员会熟悉它。它也可能使它看起来更像是Java EE应用程序的替代品。它是什么,但不是因为你可以使用弹簧。

您不需要使用任何依赖注入框架来开发JavaFX,实际上我们需要仔细查看我们的依赖项,因为如果您希望用户下载您的应用程序,它们将增加下载时间。