我遇到了一个问题:我的应用程序中有一个 JMF-Videoplayer,我想在它上面绘图(当视频继续播放时)。我遇到的问题是我使用 JLayeredPane,在 Layer.Content_Layer(索引 0)上添加 VideoPlayer-Control,在 Layer.Modal_Layer(索引 300)上添加 JPanel (setOpaque(false))。
发生的情况是,当我添加 JPanel 时,它不是不透明的,但我看到了绘制的线条,但看不到视频。如果我之前添加 JPanel(没有更改图层的索引),我添加视频控件,然后我会看到视频,但看不到绘制的线条。
有人知道为什么这不起作用以及我如何让它起作用吗?
我考虑过向视频控制组件添加一个 ActionListener,每当图像发生变化时,我都会获取该图像并将其绘制为 JPanel 上的背景,但我担心这会花费我宝贵的时间。
我的代码如下所示:
Manager.setHint( Manager.LIGHTWEIGHT_RENDERER, true );
mediaPlayer = Manager.createRealizedPlayer(url);
this.videoPane = new JLayeredPane();
this.videoPane.setLayout(new BorderLayout());
// get the components for the video and the playback controls
this.video = mediaPlayer.getVisualComponent();
this.controls = mediaPlayer.getControlPanelComponent();
this.drawPanel = new JLabel();
this.drawPanel.setSize(video.getWidth(), video.getHeight());
this.drawPanel.setOpaque(false);
if ( video != null )
this.videoPane.add(video, BorderLayout.CENTER, JLayeredPane.FRAME_CONTENT_LAYER);
if ( controls != null )
this.videoPlayerPanel.add( controls, BorderLayout.SOUTH);
this.videoPane.add(drawPanel, BorderLayout.CENTER, JLayeredPane.MODAL_LAYER);
this.videoPlayerPanel.add(videoPane, BorderLayout.CENTER);
videoPlayerPanel 也是一个 JPanel,其中包含 JLayeredPane...如您所见。
编辑: 好吧,我做了一些研究,发现了
mediaPlayer.getVisualComponent();
返回一个java.awt.Component,并且此类组件不支持不透明度 - 也许这就是我看不到或只能看到drawPanel的原因。
所以目前我正在尝试通过将视频组件添加到自定义面板中来直接绘制到视频组件上,在该面板中我重写了绘制方法来绘制所有线条。 还有其他想法吗?
最佳答案
回答了这个question .
使用 2 个 JInternalFrame,其中轻量级组件位于一个框架上,重量级 jpanel 位于另一框架上。
关于Java:在 JMF Lightweight_Rendered 播放器上绘制线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2243945/