2014-12-21 203 views
1

我正嘗試使用VLCJ構建自己的視頻播放器,但是我遇到了問題。將JPanel背景設置爲透明

我的代碼是

import java.awt.*; 
import javax.swing.*; 

import com.sun.jna.*; 

import uk.co.caprica.vlcj.component.*; 
import uk.co.caprica.vlcj.runtime.*; 

public class MainFrame extends JFrame { 

    public MainFrame(String vlcPath, String username) { 
     super("Player"); 

     setSize(1366,700); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), vlcPath); 

     EmbeddedMediaPlayerComponent player = new EmbeddedMediaPlayerComponent(); 

     setContentPane(player); 

     JPanel panel = new JPanel(); 

     player.add(panel, BorderLayout.EAST); 

     Dimension d = new Dimension(300,200); 

     panel.setOpaque(false); 
     panel.setLayout(null); 
     panel.setPreferredSize(d); 
     panel.setSize(d); 

     setVisible(true); 

     player.getMediaPlayer().playMedia("path to video"); 
    } 
} 

現在,你可以看到,我想視頻播放器是在整個屏幕上,我想在右側透明背景的疊加。

此代碼給我下面的:

enter image description here

的JPanel的背景是由於某種原因黑色,不透明。我嘗試創建自己的類來擴展JPanel並重寫paintComponent(Graphics g),但結果是一樣的。

問題是,我怎樣才能使它透明?

回答

3

該視頻正在播放重量級AWT Canvas

你不能在其上覆蓋透明的Swing組件,它根本無法工作。

選項:

  1. 覆蓋透明頂級Window,把你的覆蓋在那裏 - 這工作,因爲你的窗口管理器可以處理一個頂層窗口的透明度 - 與此問題是,它是一個有點笨重,因爲如果你移動它們或者最小化它們,你必須保持兩幀同步,而且你的窗口管理器可能會實現某種你不想要的混合效果;
  2. 使用「直接」渲染媒體播放器並在每一幀的頂部繪製自己的覆蓋圖 - 缺點是它比原生渲染效率低,因爲您自己的應用程序必須渲染每一幀(它確實有效);
  3. 僅在覆蓋圖中使用重量級組件,例如Label - 但即使如此,標籤本身也不會有透明背景;

對於#1中描述的方法,您可以使用您EmbeddedMediaPlayer實例setOverlay()方法,也可以使用enableOverlay()打開覆蓋和關閉。

對於#2中描述的方法,這可能是最簡潔的方法,因爲它不依賴於任何笨重的解決方法(如保持兩個頂層窗口同步),代價是CPU使用率更高,原生視頻播放。

沒有一個是理想的,但它是你能做的最好的。

你也應該看看vlcj測試資源,因爲有些例子顯示如何做這樣的覆蓋。