私は現在、ユーザーがプログラムにアクセスするまでホームビデオをループする必要がある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.1
、jna-4.1.0
、jna-platform-4.1.0
、slf4j-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以外)または回避策を使用して解決します。
まずはお返事ありがとうございます! '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
あなたは何を意味するのか分かりません。実際には、vlcjサンプルとvlcj-playerリファレンスプロジェクトを確認する必要があります。私は何の問題もなくvlcjで私のメディアプレーヤープロジェクトの多くでCardLayoutを使用します。マウスリスナーとCanvasを問題なく使用します。私はCanvasを一般的にSwingアプリケーションで問題なく使用します。 Swingアプリケーションで重量のあるコンポーネントを使用するには制限がありますが、*できないルールはありません。 – caprica
あなたが制限を話すとき、JLabelで半透明の要素(ロゴ、...)を使用してビデオの上に置くことができないことを意味しますか?上記の質問には関係ありませんが、回避策はありますか? 感謝の言葉をテストするために、私は現在自分のコードを変更しています。 – Iwerzhon