Запустить приложение JavaFx из класса Swing JApplet [duplicate]

Вам понадобится установить компилятор Microsoft, совместимый с компилятором, используемым для создания Python. Это означает, что вам нужен Visual C ++ 2008 (или более новый, с некоторой настройкой ).

Microsoft теперь поставляет компилированный компилятор и заголовки только , чтобы иметь возможность компилировать расширения Python на незабываемый URL:

Компилятор Microsoft Visual C ++ для Python 2.7

http://aka.ms/vcpython27

Это относительно небольшой пакет; 85 МБ для загрузки, установки без прав администратора, не требуется перезагрузка. Имя немного вводит в заблуждение, компилятор будет работать для любой версии Python, первоначально скомпилированной с Visual C ++ 2008, а не только с Python 2.7.

Если вы запустите интерактивную подсказку Python или распечатаете sys.version, найдите MSC строка версии; если это MSC v.1500, вы можете использовать этот инструмент.

Из исходного объявления в список distutils :

Microsoft выпустила компилятор пакет для Python 2.7, чтобы упростить людям сбор и распространение своих модулей расширения C в Windows. Компилятор Microsoft Visual C ++ для Python 2.7 (aka VC9) доступен из: http://aka.ms/vcpython27

Этот пакет содержит все инструменты и заголовки, необходимые для сборки C для Python 2.7 32-разрядных и 64-разрядных (обратите внимание, что некоторые модули расширения требуют сторонних зависимостей, таких как OpenSSL или libxml2, которые не включены). Другие версии Python, созданные с помощью Visual C ++ 2008, также поддерживаются, поэтому «Python 2.7» - это просто реклама - он отлично работает с 2.6 и 3.2.

Обратите внимание, что вам нужно иметь setuptools 6.0 или новее (перечисленные в системных требованиях на странице загрузки). Проект, который вы устанавливаете, должен использовать setuptools.setup(), а не distutils, или автоматическое обнаружение не будет работать.

Microsoft заявила, что хочет сохранить стабильный URL-адрес, чтобы автоматические сценарии могли ссылаться это легко.

48
задан Dan Vulpe 2 July 2012 в 13:23
поделиться

5 ответов

Найден решение. Если я просто создаю JFXPanel из Swing EDT перед вызовом JavaFX Platform.runLater, он работает. Я не знаю, насколько это надежное решение, я могу выбрать JFXPanel и JFrame, если окажется неустойчивым.

public class BootJavaFX {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JFXPanel(); // this will prepare JavaFX toolkit and environment
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        StageBuilder.create()
                                .scene(SceneBuilder.create()
                                        .width(320)
                                        .height(240)
                                        .root(LabelBuilder.create()
                                                .font(Font.font("Arial", 54))
                                                .text("JavaFX")
                                                .build())
                                        .build())
                                .onCloseRequest(new EventHandler<WindowEvent>() {
                                    @Override
                                    public void handle(WindowEvent windowEvent) {
                                        System.exit(0);
                                    }
                                })
                                .build()
                                .show();
                    }
                });
            }
        });
    }
}
18
ответ дан Dan Vulpe 26 August 2018 в 02:51
поделиться

Также можно явно инициализировать инструментарий, вызвав: com.sun.javafx.application.PlatformImpl#startup(Runnable)

Немного взломанный, из-за использования * Impl, но полезен, если вы не хотите использовать Application или JXFPanel по какой-то причине.

повторно отправляет себя из этого сообщения

20
ответ дан Community 26 August 2018 в 02:51
поделиться
private static Thread thread;

public static void main(String[] args) {

    Main main = new Main();
    startup(main);
    thread = new Thread(main);
    thread.start();
}

public static void startup(Runnable r) {
    com.sun.javafx.application.PlatformImpl.startup(r);
}

@Override
public void run() {
    SoundPlayer.play("BelievexBelieve.mp3");
}

Это мое решение. Класс называется Main и реализует Runnable. Метод startup(Runnable r) - это ключ.

0
ответ дан Jack Lin 26 August 2018 в 02:51
поделиться

Я использовал следующий при создании unittests для тестирования обновлений javaFX tableview

public class testingTableView {
        @BeforeClass
        public static void initToolkit() throws InterruptedException
        {
            final CountDownLatch latch = new CountDownLatch(1);
            SwingUtilities.invokeLater(() -> {
                new JFXPanel(); // initializes JavaFX environment
                latch.countDown();
            });

            if (!latch.await(5L, TimeUnit.SECONDS))
                throw new ExceptionInInitializerError();
        }

        @Test
        public void updateTableView() throws Exception {

            TableView<yourclassDefiningEntries> yourTable = new TableView<>();
            .... do your testing stuff

        }
    }

, хотя этот пост не связан с тестом, и это помогло мне заставить мой unittest работать

  • без initToolkit BeforeClass, тогда экземпляр TableView в unittest даст сообщение отсутствующего инструментария
4
ответ дан serup 26 August 2018 в 02:51
поделиться

Я проверил исходный код, чтобы инициализировать его

com.sun.javafx.application.PlatformImpl.startup(()->{});

и выйти из него

com.sun.javafx.application.PlatformImpl.exit();
5
ответ дан user28775 26 August 2018 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: