【发布时间】:2020-11-14 22:23:49
【问题描述】:
我正在使用VLCJ 创建一个Video Player。
播放器使用Canvas 作为它的视频表面。
videoPlayer.newVideoSurface(canvas);
所以我一定要使用Canvas。
我想在Canvas 上显示消息,例如"Player Started"。我尝试使用JLayeredPane 和JLabel 来完成此操作。
一个简短的演示代码:
package canvasexample;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
public class CanvasExample extends JFrame
{
public JLabel label = new JLabel("Message");
public Canvas canvas = new MyCanvas();
public CanvasExample()
{
setSize(500, 500);
setLocationRelativeTo(null);
createWindow();
setVisible(true);
}
public void createWindow()
{
JLayeredPane pane = new JLayeredPane();
JPanel panel1 = new JPanel(new BorderLayout());
JPanel panel2 = new JPanel(new BorderLayout());
panel1.setSize(500, 500);
panel2.setSize(500, 500);
label.setBorder(new LineBorder(Color.BLUE));
panel1.add(canvas);
panel2.add(label, BorderLayout.NORTH);
pane.add(panel1, 1, 0);
pane.add(panel2, 2, 0);
add(pane);
}
private class MyCanvas extends Canvas
{
public MyCanvas() {
setBackground (Color.GRAY);
setSize(500, 500);
}
public void paint(Graphics g)
{
g.setColor(Color.red);
g.fillOval(75, 75, 150, 75);
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new CanvasExample();
}
});
}
}
但很快我发现你不能混合使用重量级的AWT 组件和轻量级的Swing 组件。
那么,谁能告诉我如何在Canvas 上显示消息?
【问题讨论】:
-
您是否考虑过使用 Graphics 对象的 drawString 方法来实现您的目标?
-
可能与您的问题有关:stackoverflow.com/a/37602909
-
@AlexeiKovalev 是的,我尝试过覆盖
paint()方法。问题是,它会在Canvas上打印字符串,但在VLCJ开始在Canvas上渲染视频之后,找不到该字符串。 -
@Frakcool 链接的答案正是在这里。现在我对 vlcj 的首选方法是使用 JavaFX 和 PixelBuffer 解决方案,它表现良好,您可以在其上叠加图形和动画。使用 Canvas,您只能使用该链接答案中描述的内容。