Я использую API захвата веб-камеры в java для доступа к моей веб-камере. API захвата веб-камеры построен на Swing, я знаю это, однако я хочу объединить класс Swing веб-камеры с моим классом JavaFX. Класс JavaFX отображает прямоугольник на экране. Моя цель: я запускаю свой класс JavaFX, который отображает прямоугольник на экране. В какой-то момент (например, щелчок мышью) я хочу запустить веб-камеру. Веб-камера настроена так, чтобы смотреть на экран, а затем должна выполнять определенные действия с изображениями прямоугольника.
Класс JavaFX:
public class JavaFXDisplay extends Application {
@Override
public void start(Stage primaryStage) {
WebcamCapture wc = new WebcamCapture();
StackPane root = new StackPane();
Rectangle rectangle = new Rectangle();
rectangle.setWidth(500);
rectangle.setHeight(500);
Scene scene = new Scene(root, 1000, 1000);
root.getChildren().addAll(rectangle);
primaryStage.setScene(scene);
primaryStage.show();
scene.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
wc.doSomething();
}
});
}
public static void main(String[] args) {
launch(args);
}
}
Класс качелей:
public class WebcamCapture extends JFrame implements Runnable, ThreadFactory {
private static final long serialVersionUID = 6441489157408381878L;
private Executor executor = Executors.newSingleThreadExecutor(this);
private Webcam webcam = null;
private WebcamPanel panel = null;
private JTextArea textarea = null;
public WebcamCapture() {
super();
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension size = WebcamResolution.QVGA.getSize();
webcam = Webcam.getWebcams().get(0);
webcam.setViewSize(size);
panel = new WebcamPanel(webcam);
panel.setPreferredSize(size);
textarea = new JTextArea();
textarea.setEditable(false);
textarea.setPreferredSize(size);
add(panel);
add(textarea);
pack();
setVisible(true);
}
public void doSomething() {
executor.execute(this);
}
@Override
public void run() {
do {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
BufferedImage image = null;
if (webcam.isOpen()) {
if ((image = webcam.getImage()) == null) {
continue;
}
doSomeStuff;
}
} while (true);
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, "example-runner");
t.setDaemon(true);
return t;
}
public static void main(String[] args) {
new WebcamCapture();
}
}
Однако мой класс JavaFX не запускается/не отображается. Что не так с моим кодом?
SwingNode
для смешивая два. (Вы можете встроить веб-камеру непосредственно в JavaFX с помощьюSwingNode
, если компоненты невелики.) - person James_D   schedule 15.03.2017main(...)
. Вы выполняете основной метод вJavaFXDisplay
, верно...? - person James_D   schedule 15.03.2017JavaFXDisplay
. Я даже вижу, что веб-камера запущена, просто отсутствуют оба интерфейса. Но мне нужно как-то запустить класс Swing из класса JavaFX, поэтому мне нужно запустить if из потока приложения FX. - person Danielle Woods   schedule 15.03.2017Webcam
в потоке приложения FX: он просто зависает. Я предполагаю, что в родном графическом конвейере появился какой-то тупик. Вам, вероятно, все равно следует выполнять всю эту работу вне этого потока, но вы должны быть осторожны... В любом случае, я поместил пример кода в качестве сути по адресу gist.github.com/james-d/f826c9f38d53628114124a56fb7c4557. Это просто предоставляет некоторые оболочки для веб-камеры с использованием API-интерфейса параллелизма JavaFX (в основном службы). Также представление службы на основеImageView
. Не качество производства - person James_D   schedule 16.03.2017JavaFXDisplay
? Мне просто объединить это сFXCamTest
? Потому что в противном случае мне снова придется вызыватьFXCamTest
в отдельном потоке, я думаю? - person Danielle Woods   schedule 16.03.2017FXCamTest
— это просто пример использования написанных мной классов. Таким образом, код вашего приложения заменит его и будет использовать эти классы таким же образом. У вас есть только один подклассApplication
в приложении JavaFX. - person James_D   schedule 16.03.2017WebcamCapture
. Это означает, что мне нужно, чтобы окно открывалось и отображало веб-камеру, когда я ее вызываю (т.е. я создаю экземпляр класса) и с вызовом метода (методrun()
) для захвата изображений и запуска некоторого поведения. Большое спасибо за все усилия, вы мне очень помогли. Я проголосовал за ваш ответ, он просто не виден публике. - person Danielle Woods   schedule 16.03.2017cam.open()
иcam.close()
из классаWebCamService
в классFXCamTest
. Когда я это делаю, камера почему-то не запускается. - person Danielle Woods   schedule 16.03.2017init()
, но больше нигде. 2.cam.open()
иcam.close()
должны вызываться в фоновом потоке. (Это кажется более разумным.) - person James_D   schedule 16.03.2017