1

Gluon デスクトップ (ParticleApplication) アプリの FXML コントローラー内で依存性注入を使用する簡単な方法があるかどうかは誰にもわかりませんか? @Inject はすでに次のようなものに使用されています

public class HomeController {

    @Inject ParticleApplication app;

    @Inject private ViewManager viewManager;

    @Inject private StateManager stateManager;

(フレームワークの一部として) しかし、自分のオブジェクトを @Inject できるようにしたいと考えています。


編集: Gluon Ignite を使用するように提案された回答ですが、私はまだそれを理解するのに苦労しています. これが私の試みたコードの一部です:

私の ParticleApplication クラス:

package com.gluonapplication;

import com.gluonhq.ignite.guice.GuiceContext;
import com.gluonhq.particle.application.ParticleApplication;
import com.google.inject.AbstractModule;
import javafx.scene.Scene;

import java.util.Arrays;

public class GluonApplication extends ParticleApplication {

    private GuiceContext context = new GuiceContext(this, () -> Arrays.asList(new GuiceModule()));

    public GluonApplication() {
        super("Gluon Desktop Application");

        context.init();
        System.out.println("From within GluonApplication Constructor: " +
                context.getInstance(TestClassToInject.class).testDependancy.testString
        );
    }

    @Override
    public void postInit(Scene scene) {
        setTitle("Gluon Desktop Application");
    }

    class GuiceModule extends AbstractModule {
        @Override protected void configure() {
            // Use just in time injection.
        }
    }
}

私のコントローラークラス:

package com.gluonapplication.controllers;

import com.gluonapplication.TestClassToInject;
import com.gluonhq.particle.application.ParticleApplication;
import com.gluonhq.particle.state.StateManager;
import com.gluonhq.particle.view.ViewManager;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javax.inject.Inject;

public class PrimaryController {

    @Inject ParticleApplication app;

    @Inject private ViewManager viewManager;

    @Inject private StateManager stateManager;

    @Inject private TestClassToInject testClassToInject;

    @FXML
    private Label label;

    public void initialize() {
    }

    public void postInit() {
        System.out.println("From within controller's postInit() method: " +
                testClassToInject.testDependancy.testString
        );
    }

    public void dispose() {
    }
}

そして、依存関係として作成された 2 つのクラス:

package com.gluonapplication;

import javax.inject.Inject;

public class TestClassToInject {
    @Inject
    public TestDependancy testDependancy;

    public TestClassToInject() {
    }
}

package com.gluonapplication;

public class TestDependancy {
    public String testString = "This is a test string";

    public TestDependancy() {
    }
}

そして最後に私のGradleファイル:

apply plugin: 'java'
apply plugin: 'application'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'com.gluonapplication.GluonApplication'

dependencies {
    compile 'com.gluonhq:particle:1.1.0'
    compile 'com.gluonhq:ignite-guice:1.0.0'
}

正常に出力された"From within GluonApplication Constructor: " + context.getInstance(TestClassToInject.class).testDependancy.testStringので、依存関係クラスと Guice が正常に構成されていると思います。ただし、は使用時に null でSystem.out.println("From within controller's postInit() method: " + testClassToInject.testDependancy.testString);あるため、コントローラー内からは機能しません。testClassToInject

4

1 に答える 1