2014-12-21 5 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. Overlay прозрачный верхний уровень Window и поставить накладку там - это работает, потому что ваш оконный менеджер может работать с прозрачностью окна верхнего уровня - проблема с этим, это немного неудобно, потому что вы должны синхронизировать оба кадра, если вы перемещаете их или сворачиваете их, а ваш оконный менеджер может реализовать какой-то эффект смешивания, который не то, что вы хотите;
  2. Используйте «прямой» медиа-проигрыватель рендеринга и нарисуйте свой собственный оверлей поверх каждого кадра. Недостатком является то, что он менее эффективен, чем собственный рендеринг, поскольку ваше собственное приложение должно отображать каждый кадр (он действительно работает);
  3. Используйте только тяжеловесные компоненты на вашем оверлее, например Label - но даже тогда сам ярлык не будет иметь прозрачный фон;

Для подхода, описанного в # 1, вы можете использовать метод setOverlay() на вашем EmbeddedMediaPlayer например, использовать enableOverlay(), чтобы включить наложение включения и выключения.

Для подхода, описанного в № 2, это, вероятно, самый чистый подход, поскольку он не полагается на какие-либо неуклюжие обходные пути (например, сохранение двух окон верхнего уровня в синхронизации) за счет большего использования ЦП и не- воспроизведение собственного видео.

Все это не идеально, но это лучшее, что вы можете сделать.

Вы также должны, вероятно, посмотреть в источниках тестирования vlcj, потому что есть примеры, показывающие, как делать наложения, подобные этому.