Использование iPOJO в приложении JavaFX

Я делаю приложение Javafx в Apache Felix вместе с некоторыми экспериментами с использованием iPOJO.

Сначала я вызываю метод Application.launch() в другом классе, а затем запускаю другой класс, содержащий iPOJO @Requires, вот так:

public class JavafxApp extends Application {
    @Override
    public void start(Stage primaryStage){
        /* Do nothing here because I thought I can initialize JavaFX in a different class */
    }

    public static void start(){
        Platform.runLater(() -> {
            launch(JavafxApplication.class);
        });
    }
}


@Component
@Instantiate
public class MyApplication {
    @Requires
    LibraryClass class;

    @Validate
    public void start(){
        JavafxApp.start();
        class.someMethod();
    }

}

Эта реализация выдает это исключение, java.lang.IllegalStateException: Toolkit not initialized, но iPOJO обнаружила класс реализации интерфейса LibraryClass.

После некоторых исследований я обнаружил, что приложение должно быть внутри класса, который расширяет javafx.application.Application, поэтому я провел некоторую реструктуризацию.

@Component
@Instantiate
public class JavafxApp extends Application {

    @Requires
    LibraryClass class;

    @Override
    public void start(Stage primaryStage){
        class.someMethod();
    }

    @Validate
    public void start(){
        launch(JavafxApp.class);
    }

}

Изменить

Интерфейс и реализация LibraryClass:

@Component
@Provides
@Instantiate
public class LibraryClassImplementation implements LibraryClass {

    public void someMethod(){
        system.out.println("Hello Javafx using iPOJO");
    }

}

public interface LibraryClass {
    public void someMethod();
}

Теперь iPOJO выдает RuntimeException, а LibraryClass становится null, а приложение выдает NullPointerException.

Мои вопросы:

  • Можно ли использовать iPOJO в этой ситуации?
  • Если да, то как правильно использовать iPOJO в приложении JavaFX?

Заранее спасибо! :D


person megamoth    schedule 03.02.2015    source источник
comment
вы должны включить гораздо больше информации. как выглядит LibraryClass? это правильно ipojo-ized ?? как JavafxApp относится к MyApplication или LibraryClass ??   -  person Hilikus    schedule 04.02.2015
comment
Да, интерфейс правильно иподжоизирован, и я использую maven-ipojo-plugin:1.12.1 с целью ipojo-bundle   -  person megamoth    schedule 04.02.2015


Ответы (1)


Экземпляр приложения JavaFX должен быть создан платформой JavaFX с использованием одного из статических методов запуска класса Application. Насколько я знаю, невозможно, чтобы какая-то другая структура, такая как iPOJO, создавала экземпляр класса. Однако во второй реализации вы аннотировали приложение некоторыми аннотациями iPOJO (?), которые, я думаю, создадут экземпляр класса. Но именно метод запуска должен создавать экземпляр приложения, а не фреймворк.

В первой реализации вы пытаетесь вызвать метод запуска в потоке приложения JavaFX. Но это метод запуска, который запускает платформу JavaFX и поток приложения JavaFX. Также обратите внимание, что методы запуска не возвращаются, пока приложение не выйдет.

При этом обратите внимание, что я выпустил несколько версий раннего доступа Drombler FX, новой многофункциональной клиентской платформы для JavaFX на базе OSGi (Apache Felix) и Maven.

В качестве среды приложения он обеспечивает правильный запуск JavaFX и OSGi и предоставляет главное окно.

Подробнее о Drombler FX можно прочитать здесь: http://puces-blog.blogspot.ch/search/label/Drombler

Пока я использую декларативные службы (созданы из Apache Felix SCR Annotations), но я предполагаю, что также должна быть возможность использовать iPOJO для новых сервисов.

На странице Начало работы объясняется, как создать, собрать и запустить пример приложения Drombler FX с помощью нескольких простых шаги.

person Puce    schedule 10.02.2015
comment
@Pruce, не могли бы вы рассказать мне, почему это не сработало, поскольку вы являетесь экспертом в этой области? Спасибо кстати :D - person megamoth; 16.02.2015
comment
@Arjay Экземпляр приложения JavaFX должен быть создан платформой JavaFX с использованием одного из статических методов запуска класса Application. Насколько я знаю, невозможно, чтобы какая-то другая структура, такая как iPOJO, создавала экземпляр класса. Методы запуска не возвращаются, пока приложение не выйдет. Метод запуска вызовет метод запуска, вы не должны вызывать его явно. - person Puce; 16.02.2015
comment
Да, это была первая реализация, во второй части, где я вызываю launch(JavafxApp.class); вместо JavafxApp.start();, iPOJO все еще не работает. Дело в том, что iPOJO не совместим с потоком Javafx? - person megamoth; 16.02.2015
comment
@Arjay Мой комментарий относится к обеим реализациям (различным аспектам). Например. во второй реализации вы аннотировали приложение некоторыми аннотациями iPOJO (?), которые, я думаю, создадут экземпляр класса. Но именно метод запуска должен создавать экземпляр приложения, а не фреймворк. Тогда вы вызываете запуск из метода запуска? Это не сработает. Метод запуска будет вызывать метод запуска, а не наоборот. У метода также есть аннотация, которая, вероятно, не поддерживается в таком виде (@Validate). - person Puce; 17.02.2015
comment
@Arjay Метод запуска запустит платформу JavaFX и поток приложения JavaFX. Итак, да, это другой поток, отличный от потока, используемого iPOJO. - person Puce; 17.02.2015
comment
Почему бы вам не отредактировать ответ, который содержит объяснение того, почему он не сработал, а затем добавить свои предложения для Drombler FX, чтобы я мог принять ответ. Я нашел репозиторий github, и он пуст, поэтому у меня есть к вам личный вопрос: почему вы считаете sourceforge.net лучшим хостингом для вашего проекта? :D - person megamoth; 17.02.2015
comment
@Arjay Пожалуйста, посмотрите мой обновленный ответ. Что касается GitHub: предлагаю обсудить это здесь: issues.drombler.org/69 - person Puce; 19.02.2015