package com.jsca; import com.github.sarxos.webcam.Webcam; import java.awt.Dimension; import java.awt.Image; import javax.swing.SwingUtilities; public class WebcamStreamReader implements StreamReader { private final CameraPanel panel; private volatile boolean running = true; private Webcam webcam; public WebcamStreamReader(CameraPanel panel) { this.panel = panel; } @Override public void run() { try { webcam = Webcam.getDefault(); if (webcam == null) { throw new RuntimeException("No webcam detected"); } webcam.setViewSize(new Dimension(640, 480)); webcam.open(); while (running && webcam.isOpen()) { final Image image = webcam.getImage(); if (image != null) { SwingUtilities.invokeLater(() -> panel.updateFrame(image)); } Thread.sleep(33); // ~30 FPS } } catch (Exception e) { SwingUtilities.invokeLater(() -> { javax.swing.JOptionPane.showMessageDialog(panel, "Error reading from webcam: " + e.getMessage(), "Webcam Error", javax.swing.JOptionPane.ERROR_MESSAGE); }); } finally { if (webcam != null && webcam.isOpen()) { webcam.close(); } } } @Override public void stop() { running = false; } }