001package com.github.sarxos.webcam; 002 003import java.awt.BorderLayout; 004import java.awt.event.ItemEvent; 005import java.awt.event.ItemListener; 006import java.awt.event.WindowEvent; 007import java.awt.event.WindowListener; 008import java.lang.Thread.UncaughtExceptionHandler; 009 010import javax.swing.JFrame; 011import javax.swing.SwingUtilities; 012 013import org.slf4j.Logger; 014import org.slf4j.LoggerFactory; 015 016 017/** 018 * Just a simple webcam viewer. 019 * 020 * @author Bartosz Firyn (SarXos) 021 */ 022public class WebcamViewer extends JFrame implements Runnable, WebcamListener, WindowListener, UncaughtExceptionHandler, ItemListener { 023 024 private static final long serialVersionUID = 1L; 025 026 private static final Logger LOG = LoggerFactory.getLogger(WebcamViewer.class); 027 028 private Webcam webcam = null; 029 private WebcamPanel panel = null; 030 private WebcamPicker picker = null; 031 032 public WebcamViewer() { 033 SwingUtilities.invokeLater(this); 034 } 035 036 @Override 037 public void run() { 038 039 setTitle("Webcam Capture Viewer"); 040 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 041 setLayout(new BorderLayout()); 042 043 addWindowListener(this); 044 045 picker = new WebcamPicker(); 046 picker.addItemListener(this); 047 048 webcam = picker.getSelectedWebcam(); 049 050 if (webcam == null) { 051 LOG.error("No webcams found"); 052 System.exit(1); 053 } 054 055 webcam.setViewSize(WebcamResolution.VGA.getSize()); 056 webcam.addWebcamListener(WebcamViewer.this); 057 058 panel = new WebcamPanel(webcam, false); 059 panel.setFPSDisplayed(true); 060 061 add(picker, BorderLayout.NORTH); 062 add(panel, BorderLayout.CENTER); 063 064 pack(); 065 setVisible(true); 066 067 Thread t = new Thread() { 068 069 @Override 070 public void run() { 071 panel.start(); 072 } 073 }; 074 t.setName("webcam-viewer-starter"); 075 t.setDaemon(true); 076 t.setUncaughtExceptionHandler(this); 077 t.start(); 078 } 079 080 @Override 081 public void webcamOpen(WebcamEvent we) { 082 LOG.info("Webcam open"); 083 } 084 085 @Override 086 public void webcamClosed(WebcamEvent we) { 087 LOG.info("Webcam closed"); 088 } 089 090 @Override 091 public void webcamDisposed(WebcamEvent we) { 092 LOG.info("Webcam disposed"); 093 } 094 095 @Override 096 public void webcamImageObtained(WebcamEvent we) { 097 // do nothing 098 } 099 100 @Override 101 public void windowActivated(WindowEvent e) { 102 } 103 104 @Override 105 public void windowClosed(WindowEvent e) { 106 webcam.close(); 107 } 108 109 @Override 110 public void windowClosing(WindowEvent e) { 111 } 112 113 @Override 114 public void windowOpened(WindowEvent e) { 115 } 116 117 @Override 118 public void windowDeactivated(WindowEvent e) { 119 } 120 121 @Override 122 public void windowDeiconified(WindowEvent e) { 123 LOG.info("Webcam viewer resumed"); 124 panel.resume(); 125 } 126 127 @Override 128 public void windowIconified(WindowEvent e) { 129 LOG.info("Webcam viewer paused"); 130 panel.pause(); 131 } 132 133 @Override 134 public void uncaughtException(Thread t, Throwable e) { 135 e.printStackTrace(); 136 LOG.error(String.format("Exception in thread %s", t.getName()), e); 137 } 138 139 @Override 140 public void itemStateChanged(ItemEvent e) { 141 142 if (e.getItem() == webcam) { 143 return; 144 } 145 146 if (webcam == null) { 147 return; 148 } 149 150 final WebcamPanel tmp = panel; 151 152 remove(panel); 153 154 webcam.removeWebcamListener(this); 155 156 webcam = (Webcam) e.getItem(); 157 webcam.setViewSize(WebcamResolution.VGA.getSize()); 158 webcam.addWebcamListener(this); 159 160 System.out.println("selected " + webcam.getName()); 161 162 panel = new WebcamPanel(webcam, false); 163 164 add(panel, BorderLayout.CENTER); 165 166 Thread t = new Thread() { 167 168 @Override 169 public void run() { 170 tmp.stop(); 171 panel.start(); 172 } 173 }; 174 t.setDaemon(true); 175 t.setUncaughtExceptionHandler(this); 176 t.start(); 177 178 } 179}