Вам понадобится установить компилятор Microsoft, совместимый с компилятором, используемым для создания Python. Это означает, что вам нужен Visual C ++ 2008 (или более новый, с некоторой настройкой ).
Microsoft теперь поставляет компилированный компилятор и заголовки только , чтобы иметь возможность компилировать расширения Python на незабываемый URL:
Компилятор Microsoft Visual C ++ для Python 2.7
Это относительно небольшой пакет; 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-адрес, чтобы автоматические сценарии могли ссылаться это легко.
Найден решение. Если я просто создаю 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();
}
});
}
});
}
}
Также можно явно инициализировать инструментарий, вызвав: com.sun.javafx.application.PlatformImpl#startup(Runnable)
Немного взломанный, из-за использования * Impl, но полезен, если вы не хотите использовать Application
или JXFPanel
по какой-то причине.
повторно отправляет себя из этого сообщения
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)
- это ключ.
Я использовал следующий при создании 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 работать
Я проверил исходный код, чтобы инициализировать его
com.sun.javafx.application.PlatformImpl.startup(()->{});
и выйти из него
com.sun.javafx.application.PlatformImpl.exit();