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    }