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    }