2013-06-04 1 views
2

Comment ajouter JLabel avec un fond transparent sur vlcj MediaPlayer?Ajout d'un transparent JLabel top vlcj MediaPlayer?

Je mets la source ci-dessous, mais cela ne fonctionne pas comme il se doit, car JLabel n'a pas d'arrière-plan transparent.

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); 
    } 
} 

Ceci est le résultat:

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

+0

Veuillez comprendre que vous demandez à des volontaires de vous aider pendant leur temps libre. Afficher tout le code pertinent et les informations nécessaires pour répondre à la question * ici *, pas dans un lien. Si le code est trop long pour être publié ici, il est trop long de demander à des volontaires de le réviser et vous devriez le raccourcir en créant et en publiant un [sscce] (http://sscce.org) si possible. –

+0

Désolé.J'ai corrigé. – iRipVanWinkle

+0

Cela peut être une restriction de VLC car 'JLabel' est transparent par défaut ... – MadProgrammer

Répondre

1

MadProgrammer est juste. VLCJ attache une surface vidéo native à un fichier java.awt.Canvas. Vous pouvez fournir votre propre Canvas avec la méthode de peinture surchargée (..) mais cela ne vous aidera pas. C'est ce qui se passe en interne sur Linux dans 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); 
    } 

La fenêtre native java.awt.Canvas X11 est utilisé comme cible pour la sortie VLC.

Mon meilleur pari est d'utiliser le mécanisme de recouvrement comme madprogrammer mentionné. Fondamentalement, vous devrez fournir une fenêtre ou un JWindow en sous-classifiant EmbeddedMediaPlayerComponent. La transparence est la plate-forme tout à fait dépendante, vous aurez envie de vérifier si le type de transparence/transluncency est prise en charge souhaitée par votre environnement cible (attention: configurations graphiques complexes peuvent avoir des capacités différentes pour chaque dispositif d'écran!):

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

Créer une sous-classe de 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; 
      } 
     ... 
     } 

Après avoir fait le principal JFrame visible, activez la superposition:

mediaPlayerComponent.getMediaPlayer().enableOverlay(true); 

Je n'ai pas pu vérifier les résultats car je travaille sur une machine virtuelle sans fonctionnalités de transparence pour l'instant, donc mon overlay JWindow n'est pas transparent pour des raisons évidentes. S'il vous plaît laissez-nous savoir si cela fonctionne comme vous le souhaitez et s'il y a d'autres pièges.

+0

Merci beaucoup pour votre aide. Je ne sais pas ce que je ferais sans votre conseil. – iRipVanWinkle

0

Il semblerait que vous créez une couleur avec une valeur alpha (ce qui signifie qu'il est transparent):

new Color(0, 200, 0, 50) 

Essayez simplement en utilisant

new Color(0, 200, 0) 

(à moins que je l'ai manqué le point de la question)

+0

il y a "sous-label" sous "label", mais pas de vidéo. J'ai besoin d'avoir une vidéo et "sublabel" sous "label" – iRipVanWinkle

1

Vous devez prendre le temps de lire la vlcj wiki ...

Vous ne pouvez pas ajouter simplement un JComponent transparent léger sur le dessus de le composant Canvas de surface vidéo lourd - cela ne fonctionnera pas.

Découvrez Overlaying Graphics pour plus de détails

+0

** Merci beaucoup! ** – iRipVanWinkle

Questions connexes