2

我正在看这个例子:在 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();
        }
    }
}
}`

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

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

4

2 回答 2

1

给猫剥皮的方法有很多种。我猜想在那篇文章中使用 Spring 的动机是因为许多 Web 开发人员都会熟悉它。它还可能使它看起来更像是 Java EE 应用程序的替代品。它是,但不是因为你可以用它来使用弹簧。

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

于 2012-12-12T21:57:22.720 回答
1

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

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

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

于 2012-12-12T15:56:27.710 回答