#java #matlab #javafx
#java #matlab #javafx
Вопрос:
Я хотел бы запустить простой медиаплеер, созданный на Java из MATLAB, точнее, этот:https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/mediaplayerjava.htm
Этот код компилируется без каких-либо проблем и работает как при попытке запустить его в IntelliJ, так и при компиляции с javac
и запуске файла .class.
Он успешно компилируется под той же версией Java, что и моя MATLAB, поэтому я сообщаю, где находятся java-файлы javaaddpath(pwd)
. По какой-то причине я получаю сообщение об ошибке «Неопределенная функция или переменная ‘MediaPlayer’ при запуске кода, приведенного в ссылке выше, делая это следующим образом: test = MediaPlayer
или test = MediaPlayer();
Чтобы убедиться, что все работает, я попытался скомпилировать, а затем запустить простой Java Hello World в MATLAB, который работал нормально.
В чем может быть проблема? Если у вас есть время, пожалуйста, помогите мне, скомпилировав код по ссылке выше (2 файла, нажмите «Следующая страница для второго файла Java) и попробуйте запустить его в MATLAB. Я был бы чрезвычайно благодарен за любую помощь!
Ответ №1:
Короткий ответ:
MediaPlayer
Определено в пакете mediaplayer
в вашем Java (FX) коде:
package mediaplayer;
Следовательно, правильная инициализация будет:
test = mediaplayer.MediaPlayer();
Длинный ответ:
С этого момента этот вопрос становится действительно специфичным для JavaFX, а не о тривиальной совместимости Matlab — Java.
Проблемы:
- JavaFX по умолчанию включен в Java8, и даже Matlab R2016 поставляется с Java7, поэтому пакет JavaFX (
javafx.*
) не будет находиться в пути к классам JVM Matlab, поэтому вы должны убедиться, что JavaFX находится в пути к классам JVM. - Как только вам удастся запустить
Application
(напримерtest = mediaplayer.MediaPlayer(); test.main({''});
), он заблокирует поток Matlab. Что еще хуже, когда вы закрываете окно,Application
все равно не завершится, и поток Matlab остается заблокированным. Это можно обойти, вызвавsetImplicitExit(true)
вstart
методеApplication
. Это заставитApplication
завершиться, когда всеStage
будут закрыты, поэтому поток Matlab больше не блокируется. - На данный момент проблема заключается в том, что
Application
не может быть запущен более одного раза. Итак, если вы завершили работу, вы никогда не сможете снова запустить то же самоеApplication
.
Что вы можете сделать для обработки последних двух пунктов, так это реализовать «Application starter» на Java, который выполняется в отдельном потоке и может использоваться для выполнения приложений JavaFX.
Комментарии:
1. Я фактически удалил пакет из кода, поэтому я компилирую его, как описано. В любом случае, проблема все еще существует. Вы правы в том, что Matlab R2016 поставляется с Java7, поэтому я компилирую код следующим образом (OS X): javac -source 1.7 -target 1.7 MediaPlayer.java и это работает, я могу нажать на файл класса, и медиаплеер запустится. Я попытаюсь добавить пакет JavaFX в мою JVM MATLAB. Что касается проблем, о которых вы упоминаете, эта информация была очень ценной для меня, большое спасибо! PS. Есть ли какой-нибудь хороший источник для такого рода информации, касающейся MATLAB и Java?
2. В прошлом мне приходилось подключать серверную часть Matlab к интерфейсу JavaFX, и в те дни не было ничего действительно достойного материала по этой теме. Содержание этого ответа на самом деле представляет собой проблемы, с которыми я столкнулся при выполнении задачи, и решения были получены в основном в результате экспериментов и чтения документации JavaFX (особенно javadoc
Application
класса может быть действительно ценным, чтобы понять, почему что-то происходит 🙂 ).