我找不到任何清楚演示如何将 Xuggler 包装在 JPanel 中的帖子。我可以看到一些 JFrame 的帖子,但该解决方案并不容易转换为 JPanel。 (或许是我太天真了!)
更具体地说,以下方法不适用于 JPanel,因为它适用于 JFrame -
private class MyVideoFrame extends JFrame
{
....
public void paint(Graphics g)
{
if (image != null)
{
g.drawImage(image, 0, 0, null);
}
}
}
谢谢!
最佳答案
VideoImage
source 实际上使用了 JComponent
,这不是最佳选择,但它是 JPanel
的父级。
事实上,他们重写了 paint
并且未能调用 super.paint
,这是一个非常糟糕的例子。
相反,他们应该使用 JPanel
(默认情况下它不透明),重写 paintComponent
并在渲染之前调用 super.paintComponent
框架。
所以基于DecodeAndPlayAudioAndVideo或DecodeAndPlayVideo
您应该能够将 com.xuggle.xuggler.demos.VideoImage
的引用替换为下面的引用,该引用使用 JPanel
作为用于展示...的视频框架容器
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class VideoImage extends JFrame {
private final ImagePane mOnscreenPicture;
public VideoImage() {
super();
mOnscreenPicture = new ImagePane();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(mOnscreenPicture);
this.setVisible(true);
this.pack();
}
public void setImage(final BufferedImage aImage) {
mOnscreenPicture.setImage(aImage);
}
//....Inner class here....//
public class ImagePane extends JPanel {
private BufferedImage mImage;
public void setImage(BufferedImage image) {
SwingUtilities.invokeLater(new ImageRunnable(image));
}
@Override
public Dimension getPreferredSize() {
return mImage == null ? new Dimension(200, 200) : new Dimension(mImage.getWidth(), mImage.getHeight());
}
private class ImageRunnable implements Runnable {
private final BufferedImage newImage;
public ImageRunnable(BufferedImage newImage) {
super();
this.newImage = newImage;
}
@Override
public void run() {
ImagePane.this.mImage = newImage;
Dimension size = getPreferredSize();
final Dimension newSize = new Dimension(mImage.getWidth(), mImage.getHeight());
if (!newSize.equals(size)) {
VideoImage.this.invalidate();
VideoImage.this.revalidate();
VideoImage.this.pack();
repaint();
}
repaint();
}
}
public ImagePane() {
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (mImage != null) {
g.drawImage(mImage, 0, 0, this);
}
}
}
}
关于java - 将 xuggler 包裹在 JPanel 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22314421/