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.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 }