java-如何在画布上绘制消息?

java-如何在画布上绘制消息?,java,swing,canvas,awt,Java,Swing,Canvas,Awt,我正在使用VLCJ创建一个视频播放器 播放器使用画布作为视频表面 videoPlayer.newVideoSurface(canvas); 因此,我必须使用画布 我想在画布上显示消息如“播放器已启动”。我尝试使用JLayeredPane和JLabel来完成这项工作 一个简短的演示代码: package canvasexample; import java.awt.*; import javax.swing.*; import javax.swing.border.LineBorder; p

我正在使用
VLCJ
创建一个
视频播放器

播放器使用
画布作为视频表面

videoPlayer.newVideoSurface(canvas);
因此,我必须使用
画布

我想在
画布上显示消息
“播放器已启动”
。我尝试使用
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
组件混合使用


那么,有人能告诉我如何在
画布上显示消息吗?

如果您试图在需要使用的vlcj嵌入式画布上覆盖静态文本

或者直接在mediaplayer中使用品牌选项

除了文本,您还可以查看覆盖图


或者我还没有尝试过这种方法,你可以创建一个在第1层有画布,可以有JComponent在第0层用透明背景绘制覆盖图的方法,你可以覆盖它的paintComponent()方法并绘制您需要的任何内容

您是否考虑过使用Graphics object的drawString方法来实现您的目标?可能与您的问题有关:@AlexeiKovalev是的,我尝试过重写
paint()
方法。问题是,它在
画布上打印字符串
,但在
VLCJ
开始在
画布上渲染视频后,字符串就不存在了。由@Frakcool链接的答案正好在这里。如今,我对vlcj的首选方法是使用JavaFX和PixelBuffer解决方案,它的性能很好,您可以在上面覆盖图形和动画。使用Canvas时,您仅限于链接答案中描述的内容。最后一种方法将不起作用。不能将轻量级
Swing
组件(如
JComponent
)覆盖在重型
AWT
组件(如
Canvas
)上。