java - 将 xuggler 包裹在 JPanel 中

标签 java swing jpanel xuggler

我找不到任何清楚演示如何将 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框架。

所以基于DecodeAndPlayAudioAndVideoDecodeAndPlayVideo

您应该能够将 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/

相关文章:

java - 如何在jtable中添加列值

java - SolrJ 没有捕获 SolrException

java - 无法在 java 应用程序中编写 h2 数据库中的脚本文件

java - 以动态方式在 JScrollPane 上插入面板

java - JPanel 在调整大小时不刷新图形组件

java - 如何调整 JPanel 的大小

java - 面板未显示在 JFrame 中

java - Java 中是否保证从左到右的操作顺序?

java - Android ClassNotFoundException 与 appcompat-v7 :28. 0.0

Java swing UI线程和事件按钮事件