package io.swtc; import com.github.sarxos.webcam.Webcam; import io.swtc.proccessing.WebcamCaptureLoop; import javax.swing.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; public class SwingCameraWindow { private final JFrame frame; private final CameraPanel cameraPanel; private final WebcamCaptureLoop captureLoop; public SwingCameraWindow(Webcam webcam) { this.frame = new JFrame("scctv@" + webcam.getName()); this.frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); this.frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // clean shit up frame.dispose(); } }); this.cameraPanel = new CameraPanel(); this.frame.add(cameraPanel); this.frame.pack(); this.frame.setSize(640, 480); this.captureLoop = new WebcamCaptureLoop(webcam, (BufferedImage img) -> { SwingUtilities.invokeLater(() -> { cameraPanel.setImage(img); }); }); this.frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { captureLoop.stop(); } }); } public void open() { frame.setVisible(true); captureLoop.start(); } private static class CameraPanel extends JPanel { private BufferedImage currentImage; public void setImage(BufferedImage img) { this.currentImage = img; this.repaint(); // Triggers paintComponent } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (currentImage != null) { // Draw the image scaled to the panel size g.drawImage(currentImage, 0, 0, getWidth(), getHeight(), null); } } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { // init in edt Webcam webcam = Webcam.getDefault(); if (webcam != null) { SwingCameraWindow window = new SwingCameraWindow(webcam); window.open(); } else { System.err.println("No webcam found!"); } }); } }