2014-12-21 4 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"); 
    } 
} 

이고, 나는 오른쪽에 투명한 배경에 오버레이를 원한다.

이 코드는 다음 나에게주는 다음 인 JPanel의

enter image description here

배경은 투명, 검은하지 어떤 이유에서입니다. JPanel을 확장하고 paintComponent (Graphics g)를 재정의하는 클래스를 만들려고했지만 그 결과는 같습니다.

질문은 어떻게 투명하게 만들 수 있습니까?

답변

3

동영상이 헤비급 AWT Canvas에서 재생되고 있습니다.

투명한 스윙 구성 요소를 오버레이하여 오버레이 할 수는 없으며 간단히 작동하지 않습니다.

옵션 :

  1. 오버레이 투명한 최고 수준의 Window 거기에 오버레이를 넣어 - 창 관리자는 최상위 윈도우의 투명성을 처리 할 수 ​​있기 때문에이 작품 -이의 문제가 조금 있어요된다 clunky 당신이 그것들을 움직이거나 최소화한다면 두 프레임을 동기화시켜야하기 때문에, 창 관리자는 당신이 원하는 것이 아닌 어떤 종류의 블렌드 이펙트를 구현할 수 있습니다;
  2. "직접"렌더링 미디어 플레이어를 사용하고 각 프레임 상단에 자신 만의 오버레이를 페인트합니다. 단점은 고유 한 응용 프로그램이 각 프레임을 렌더링해야하므로 성능이 떨어집니다 (작동 함).
  3. Label과 같이 오버레이에서 중량이 많은 구성 요소 만 사용하십시오.하지만 그 자체도 투명 배경이 아닙니다.

는 # 1에 기술 된 방법의 경우에 끌 오버레이를 켜 enableOverlay()를 사용하여도, 당신의 EmbeddedMediaPlayer 인스턴스에서 setOverlay() 방법을 사용할 수 있습니다.

# 2에서 설명한 접근 방법의 경우 두 가지 최상위 창을 동기화하여 유지하는 것과 같은 어리숙한 해결 방법에 의존하지 않으므로 아마도 가장 깨끗한 방법 일 것입니다. 네이티브 비디오 재생.

이 중 가장 이상적인 것은 없지만 할 수있는 최선입니다.

이렇게 오버레이를 수행하는 방법을 보여주는 예제가 있으므로 vlcj 테스트 소스를 확인해야합니다.