001 package com.github.sarxos.webcam; 002 003 import java.awt.BorderLayout; 004 import java.awt.event.ItemEvent; 005 import java.awt.event.ItemListener; 006 import java.awt.event.WindowEvent; 007 import java.awt.event.WindowListener; 008 import java.lang.Thread.UncaughtExceptionHandler; 009 010 import javax.swing.JFrame; 011 import javax.swing.SwingUtilities; 012 013 import org.slf4j.Logger; 014 import org.slf4j.LoggerFactory; 015 016 017 /** 018 * Just a simple webcam viewer. 019 * 020 * @author Bartosz Firyn (SarXos) 021 */ 022 public 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.setDaemon(true); 075 t.setUncaughtExceptionHandler(this); 076 t.start(); 077 } 078 079 @Override 080 public void webcamOpen(WebcamEvent we) { 081 LOG.info("Webcam open"); 082 } 083 084 @Override 085 public void webcamClosed(WebcamEvent we) { 086 LOG.info("Webcam closed"); 087 } 088 089 @Override 090 public void webcamDisposed(WebcamEvent we) { 091 LOG.info("Webcam disposed"); 092 } 093 094 @Override 095 public void webcamImageObtained(WebcamEvent we) { 096 // do nothing 097 } 098 099 @Override 100 public void windowActivated(WindowEvent e) { 101 } 102 103 @Override 104 public void windowClosed(WindowEvent e) { 105 webcam.close(); 106 } 107 108 @Override 109 public void windowClosing(WindowEvent e) { 110 } 111 112 @Override 113 public void windowOpened(WindowEvent e) { 114 } 115 116 @Override 117 public void windowDeactivated(WindowEvent e) { 118 } 119 120 @Override 121 public void windowDeiconified(WindowEvent e) { 122 LOG.info("Webcam viewer resumed"); 123 panel.resume(); 124 } 125 126 @Override 127 public void windowIconified(WindowEvent e) { 128 LOG.info("Webcam viewer paused"); 129 panel.pause(); 130 } 131 132 @Override 133 public void uncaughtException(Thread t, Throwable e) { 134 LOG.error(String.format("Exception in thread %s", t.getName()), e); 135 } 136 137 @Override 138 public void itemStateChanged(ItemEvent e) { 139 140 if (e.getItem() == webcam) { 141 return; 142 } 143 144 if (webcam == null) { 145 return; 146 } 147 148 final WebcamPanel tmp = panel; 149 150 remove(panel); 151 152 webcam.removeWebcamListener(this); 153 154 webcam = (Webcam) e.getItem(); 155 webcam.setViewSize(WebcamResolution.VGA.getSize()); 156 webcam.addWebcamListener(this); 157 158 System.out.println("selected " + webcam.getName()); 159 160 panel = new WebcamPanel(webcam, false); 161 162 add(panel, BorderLayout.CENTER); 163 164 Thread t = new Thread() { 165 166 @Override 167 public void run() { 168 tmp.stop(); 169 panel.start(); 170 } 171 }; 172 t.setDaemon(true); 173 t.setUncaughtExceptionHandler(this); 174 t.start(); 175 176 } 177 }