gpt4 book ai didi

java - 将 xuggler 包裹在 JPanel 中

转载 作者:行者123 更新时间:2023-12-01 13:18:00 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com