package io.swtc; import com.github.sarxos.webcam.Webcam; import io.swtc.proccessing.ui.IconSetter; import io.swtc.proccessing.ui.iframe.*; // Your custom frames import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashMap; import java.util.Map; public class SwingIFrame { private final JFrame mainFrame; private final DesktopPane desktopPane; private final Map cameraToEffects = new HashMap<>(); private boolean fullscreen = false; private Rectangle windowedBounds; private boolean blackbg = false; private final Color bgcolor = Color.decode("#336B6A"); private final Color defDesktopBg = Color.WHITE; private final JPopupMenu popupMenu = new JPopupMenu(); public SwingIFrame() { mainFrame = new JFrame("Viewer"); mainFrame.setSize(1280, 720); mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); mainFrame.setIconImage(IconSetter.getIcon()); desktopPane = new DesktopPane(cameraToEffects); desktopPane.setBackground(defDesktopBg); mainFrame.add(desktopPane, BorderLayout.CENTER); setupFullscreenToggle(); setupBlackBg(); initPopupMenu(); desktopPane.addMouseListener(popupListener()); } public void addCameraInternalFrame(Webcam webcam) { CameraInternalFrame cameraFrame = new CameraInternalFrame(webcam, this::handleEffectsRequest); EffectsPanelFrame effectsFrame = new EffectsPanelFrame( "Effects - " + webcam.getName(), cameraFrame.getCameraPanel() ); cameraToEffects.put(cameraFrame, effectsFrame); int offset = desktopPane.getAllFrames().length * 15; cameraFrame.setLocation(50 + offset, 50 + offset); effectsFrame.setLocation(700 + offset, 50 + offset); effectsFrame.setVisible(false); cameraFrame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() { @Override public void internalFrameClosing(javax.swing.event.InternalFrameEvent e) { EffectsPanelFrame ef = cameraToEffects.remove(cameraFrame); if (ef != null) ef.dispose(); desktopPane.forgetFrame(cameraFrame); cameraFrame.dispose(); } }); desktopPane.add(cameraFrame); desktopPane.add(effectsFrame); // Attach popup menu to frames and content MouseAdapter popup = popupListener(); cameraFrame.addMouseListener(popup); cameraFrame.getContentPane().addMouseListener(popup); effectsFrame.addMouseListener(popup); effectsFrame.getContentPane().addMouseListener(popup); cameraFrame.setVisible(true); } private void handleEffectsRequest(CameraInternalFrame source) { EffectsPanelFrame effectsFrame = cameraToEffects.get(source); if (effectsFrame != null) { effectsFrame.setVisible(true); try { effectsFrame.setSelected(true); effectsFrame.toFront(); } catch (java.beans.PropertyVetoException ex) { JOptionPane.showMessageDialog(null, "Focus Error: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } } private MouseAdapter popupListener() { return new MouseAdapter() { private void showPopup(MouseEvent e) { if (e.isPopupTrigger()) { // cross-platform trigger popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } @Override public void mousePressed(MouseEvent e) { showPopup(e); } @Override public void mouseReleased(MouseEvent e) { showPopup(e); } }; } private void initPopupMenu() { popupMenu.removeAll(); // clean slate JCheckBoxMenuItem fullscreenItem = new JCheckBoxMenuItem("Fullscreen"); fullscreenItem.addActionListener(e -> toggleFullscreen()); popupMenu.addPopupMenuListener(new javax.swing.event.PopupMenuListener() { @Override public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent e) { fullscreenItem.setState(fullscreen); } @Override public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent e) {} @Override public void popupMenuCanceled(javax.swing.event.PopupMenuEvent e) {} }); popupMenu.add(fullscreenItem); } private void setupBlackBg() { JRootPane root = mainFrame.getRootPane(); root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("B"), "toggleBlackBg"); root.getActionMap().put("toggleBlackBg", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { toggleBackground(); } }); } private void setupFullscreenToggle() { JRootPane root = mainFrame.getRootPane(); root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("F11"), "toggleFullscreen"); root.getActionMap().put("toggleFullscreen", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { toggleFullscreen(); } }); } private void toggleBackground() { desktopPane.setBackground(blackbg ? defDesktopBg : bgcolor); blackbg = !blackbg; desktopPane.repaint(); } /** Toggle fullscreen mode */ private void toggleFullscreen() { if (!fullscreen) { windowedBounds = mainFrame.getBounds(); mainFrame.dispose(); mainFrame.setUndecorated(true); mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); mainFrame.setVisible(true); } else { mainFrame.dispose(); mainFrame.setUndecorated(false); mainFrame.setExtendedState(JFrame.NORMAL); mainFrame.setBounds(windowedBounds); mainFrame.setVisible(true); } fullscreen = !fullscreen; } public void show() { mainFrame.setLocationRelativeTo(null); mainFrame.setVisible(true); } }