2013-06-04 31 views
2

如何在vlcj MediaPlayer上添加透明背景的JLabel?添加透明JLabel top vlcj MediaPlayer?

我把源代碼放在下面,但它不能正常工作,因爲JLabel沒有透明背景設置。

import com.sun.jna.NativeLibrary; 
import javax.swing.*; 
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; 
import uk.co.caprica.vlcj.runtime.RuntimeUtil; 

class VideoExample extends JFrame { 

    private EmbeddedMediaPlayerComponent mediaPlayerComponent; 

    public VideoExample(String path) { 
     super("Простой видео плеер"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(640, 480); 

     //Create JLayeredPane 
     JLayeredPane mainLayer = new JLayeredPane(); 
     mainLayer.setSize(640,480); 

     //Create MediaPlayer on background 
     mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 
     mediaPlayerComponent.setLocation(0, 0); 
     mediaPlayerComponent.setSize(mainLayer.getSize()); 

     //Create MediaPlayer on foreground 
     JLabel label = new JLabel("LABEL", JLabel.CENTER); 
     label.setBounds(100, 100, 200, 100); 
     label.setOpaque(false); 

     mainLayer.add(mediaPlayerComponent, JLayeredPane.DEFAULT_LAYER); //add mediaPlayer in DEFAULT_LAYER 
     mainLayer.add(label, JLayeredPane.PALETTE_LAYER); //add label in PALETTE_LAYER 
     add(mainLayer); // add JLayeredPane in JFrame 

     setVisible(true); 
     mediaPlayerComponent.getMediaPlayer().playMedia(path); 
    } 

    public static void main(String[] args) { 
     NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), System.getProperty("user.dir") + "/lib/vlc64"); 
     final String mrl = "D:\\Candlelight_QT.mov"; 
     new VideoExample(mrl); 
    } 
} 

這是結果:

The result http://vitamin.vipdesign.com.ua/1n7tJ.jpg

+0

請理解您在請求志願者幫助他們的空閒時間。顯示回答問題*所需的所有相關代碼和信息*,而不是鏈接。如果代碼太長而無法在此處發佈,那麼請志願者審覈並且您應該儘可能通過創建併發布[sscce](http://sscce.org)來縮短代碼太長。 –

+0

對不起。我糾正了。 – iRipVanWinkle

+0

這可能是VLC的限制,因爲'JLabel'默認是透明的... – MadProgrammer

回答

1

MadProgrammer是正確的。 VLCJ將本地視頻表面附加到java.awt.Canvas。您可以使用重寫的paint(..)方法提供您自己的Canvas,但這無濟於事。這是在Linux中LinuxVideoSurfaceAdapter內部發生:

public void attach(LibVlc libvlc, MediaPlayer mediaPlayer, long componentId) { 
     Logger.debug("attach(componentId={})", componentId); 
     libvlc.libvlc_media_player_set_xwindow(mediaPlayer.mediaPlayerInstance(), (int)componentId); 
    } 

本機java.awt.Canvas的X11窗口用作VLC輸出的目標。

我最好的選擇是使用像提到的madprogrammer這樣的覆蓋機制。基本上你需要通過繼承EmbeddedMediaPlayerComponent來提供Window或JWindow。透明度是非常依賴於平臺你要檢查是否透明/ transluncency期望的類型由目標環境的支持(請注意:複雜的圖形配置可能對每個屏幕設備不同的功能!):

final boolean perPixelTranslucencySupported = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().isWindowTranslucencySupported(WindowTranslucency.PERPIXEL_TRANSLUCENT); 

創建EmbeddedMediaPlayerComponent的子類:

mediaPlayerComponent = new EmbeddedMediaPlayerComponent() { 

      @Override 
      protected Window onGetOverlay() { 
       final JWindow transparentWindow = new JWindow(); 

       // Set basic window opacity if required - the window system must support WindowTranslucency (i.e. PERPIXEL_TRANSLUCENT)! 
       transparentWindow.setOpacity(0.8f); 
       // White with transparent alpha channel - WindowTranslucency is required for translucency. 
       transparentWindow.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.0f)); 

       final JLabel superImposedLightweigtLabel = new JLabel("Hello, VLC.", JLabel.CENTER); 
       superImposedLightweigtLabel.setOpaque(false); 

       transparentWindow.getContentPane().add(superImposedLightweigtLabel); 
       return transparentWindow; 
      } 
     ... 
     } 

使主JFrame的可見後,使覆蓋:

mediaPlayerComponent.getMediaPlayer().enableOverlay(true); 

我無法驗證結果,因爲我現在在沒有透明度功能的虛擬機中工作,所以我的實際JWindow疊加層不透明,原因很明顯。請讓我們知道它是否按預期工作,是否還有其他陷阱。

+0

非常感謝您的幫助。如果沒有你的建議,我不知道我會做什麼。 – iRipVanWinkle

0

這樣看來,你創建了一個具有阿爾法值的顏色(這意味着它是透明的):

new Color(0, 200, 0, 50) 

嘗試正在使用

new Color(0, 200, 0) 

(除非我已經錯過了問題的要點)

+0

「label」下有「sublabel」,但沒有視頻。我需要在「標籤」下有視頻和「sublabel」 – iRipVanWinkle