Search code examples
javaswingjmfaugmented-reality

Painting over JMF component


I'm capturing the Stream from a webcam and would like to draw something on top of the video image. I try that in the example below, the problem is that the other component is always in the background no matter how I arrange the components. Is there a way do solve this?

public class SwingCapture extends JPanel {

private static final long serialVersionUID = -1284686239737730338L;
private static Player player = null;
public static final int WIDTH = 640;
public static final int HEIGHT = 480;
private MediaLocator ml = null;

public SwingCapture() 
{
    setLayout(null);
    setSize(WIDTH, HEIGHT);

    ml = new MediaLocator("vfw:Microsoft WDM Image Capture (Win32):0"); 
    try  {
        player = Manager.createRealizedPlayer(ml);
        player.start();

        Component comp = null;
        if ((comp = player.getVisualComponent()) != null) {
            add(comp);   
            comp.setBounds(0, 0, 640, 480);
        }
        add(Canvas.getInstance());
        Canvas.getInstance().setBounds(0, 0, 640, 480);
    } 
    catch (Exception e) 
    {
      e.printStackTrace();
    }
}

public static void playerclose() {
   player.close();
   player.deallocate();
}
}

Solution

  • I have solved the problem. I used a Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, true); and a JLayerPane.

    public class SwingCapture extends JPanel {
    private static final long serialVersionUID = -1284686239737730338L;
    public static Player player = null;
    public static final int WIDTH = 640;
    public static final int HEIGHT = 480;
    public MediaLocator ml = null;
    
    public SwingCapture() {
        setLayout(null);
        setSize(WIDTH, HEIGHT);
        JLayeredPane jLP = new JLayeredPane(); 
        jLP.setBounds(0,0,800,600);
        ml = new MediaLocator("vfw:Microsoft WDM Image Capture (Win32):0"); 
        try  {
            Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, true);
            player = Manager.createRealizedPlayer(ml);
            player.start();
            jLP.add(Canvas.getInstance());
            Canvas.getInstance().setBounds(0, 0, 200, 200);
            Component comp = null;
            if ((comp = player.getVisualComponent()) != null) {
                jLP.add(comp, -1);   
                comp.setBounds(0, 0, 640, 480);
            }
    
            add(jLP);
        } catch (Exception e) {
          e.printStackTrace();
        }
    }
    
     public static void playerclose() 
     {
        player.close();
        player.deallocate();
     }
    }