2017-03-16 12 views
0

私は現在、ユーザーがプログラムにアクセスするまでホームビデオをループする必要があるJavaインターフェイスを開発中です。私はビデオを読むためにvlcjを使用しており、うまくいきます。MouseListenerをvlcjで使用する

しかし、誰かがビデオをクリックしているかどうかを検出する必要があります。悲しいことに、wikiに記載されているように、メディアプレーヤーは重量のあるコンポーネントに配置する必要があります。これはキャンバス(AWTオブジェクトであり、Swingオブジェクトではありません)の下に置かなければならないことを意味します。したがって、解決策hereは私の問題には適用できないようです。

これ以降、(Canvasの外で動作していても)動画のクリックは検出できません。

私はJFrameの中に直接メディアプレーヤーを配置することも可能である知っている:

JFrame frame = new JFrame("My First Media Player"); 
frame.setBounds(100, 100, 600, 400); 
mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 
frame.setContentPane(mediaPlayerComponent); 
frame.setVisible(true); 
mediaPlayerComponent.getMediaPlayer().playMedia("./Video.mp4"); 

が、それがここで可能ていないようです:私は私のJPanelをナビゲートするCardLayoutを使用している、など、メディアプレーヤーを含むホームページ。ここ

は、添付のMouseListenerとのJPanelに含まれるキャンバスでvlcjを実行vlcj-3.10.1jna-4.1.0jna-platform-4.1.0slf4j-api-1.7.24(およびslf4j-simple-1.7.24)とSSCCEあります。動画をクリックすると何も起こりませんが、外部(キャンバス)をクリックすると座標が取得されます。

public class mediaplayer { 

    JFrame frame; 
    JPanel p; 
    Canvas c; 

    public static void main(final String[] args) { 
     new NativeDiscovery().discover(); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new mediaplayer(args); 
      } 
     }); 
    }  

    private mediaplayer(String[] args) { 
     frame = new JFrame("vlcj player"); 
     frame.setSize(1200, 800); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     p = new JPanel(); 
     p.setLayout(null); // Absolute positionning 
     p.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent me) { 
       double x = me.getX(); 
       double y = me.getY(); 
       System.out.println("X and Y: " + x + " " + y); 
      } 
     }); 

     // heavyweight component where to place MediaPlayer 
     c = new Canvas(); 
     c.setBackground(Color.black); 
     c.setBounds(0, 0, 1000, 560); 

     p.add(c); 

     frame.add(p, BorderLayout.CENTER); 

     MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(); 
     EmbeddedMediaPlayer mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer(); 
     mediaPlayer.setVideoSurface(mediaPlayerFactory.newVideoSurface(c)); 
     mediaPlayer.setRepeat(true); 
     mediaPlayer.prepareMedia("./Video.mp4"); 
     mediaPlayer.play(); 
    } 
} 

キャンバス上のMouseListenerを使用する方法、またはそれはマウスクリックを検出することを可能にするような方法でvlcj使用する方法はありますか?事前に感謝します。

私がここで求めているのは、AWT.CanvasとSwingの間の接続の欠如に対処するためのソリューションです(Canvas以外)または回避策を使用して解決します。

答えて

0

LinuxおよびWindowsでvlcjを使用すると、ビデオ面にMouseListenerを追加すると、通常の方法で正しく動作するはずです。

あなたはvlcj MediaPlayerComponentカプセル化を使用する場合、これは(少なくとも私にとっては)動作します:あなたはMediaPlayerComponentを使用していない

mediaPlayerComponent.getVideoSurface().addMouseListener(listener); 

場合は、ちょうどあなたのCanvasに直接あなたのリスナーを追加します。

+0

まずはお返事ありがとうございます! 'MediaPlayerComponent'は重いコンポーネント(ここでは' JFrame'でしょう)に配置する必要があるので、 'CardLayout'を使ってそれを使う方法が見えません。オプション。発見された情報[ここ](http://stackoverflow.com/questions/9612684/drawing-in-java-using-canvas)と[here](http://stackoverflow.com/questions/10556369/mouselistener-in -canvas-not-working) 'Swing'環境で' awt.Canvas'情報にアクセスするのは良い習慣ではないと思いました。私はこれをどうやって行うのかを文書化し、結果を伝えます。 – Iwerzhon

+0

あなたは何を意味するのか分かりません。実際には、vlcjサンプルとvlcj-playerリファレンスプロジェクトを確認する必要があります。私は何の問題もなくvlcjで私のメディアプレーヤープロジェクトの多くでCardLayoutを使用します。マウスリスナーとCanvasを問題なく使用します。私はCanvasを一般的にSwingアプリケーションで問題なく使用します。 Swingアプリケーションで重量のあるコンポーネントを使用するには制限がありますが、*できないルールはありません。 – caprica

+0

あなたが制限を話すとき、JLabelで半透明の要素(ロゴ、...)を使用してビデオの上に置くことができないことを意味しますか?上記の質問には関係ありませんが、回避策はありますか? 感謝の言葉をテストするために、私は現在自分のコードを変更しています。 – Iwerzhon

関連する問題