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

Posted

技术标签:

【中文标题】java-如何在画布上绘制消息?【英文标题】:java- How to draw message over a Canvas? 【发布时间】:2020-11-14 22:23:49 【问题描述】:

我正在使用VLCJ 创建一个Video Player

播放器使用Canvas 作为它的视频表面。

videoPlayer.newVideoSurface(canvas);

所以我一定要使用Canvas

我想在Canvas 上显示消息,例如"Player Started"。我尝试使用JLayeredPaneJLabel 来完成此操作。

一个简短的演示代码:

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 方法来实现您的目标? 可能与您的问题有关:***.com/a/37602909 @AlexeiKovalev 是的,我尝试过覆盖 paint() 方法。问题是,它会在Canvas 上打印字符串,但在VLCJ 开始在Canvas 上渲染视频之后,找不到该字符串。 @Frakcool 链接的答案正是在这里。现在我对 vlcj 的首选方法是使用 JavaFX 和 PixelBuffer 解决方案,它表现良好,您可以在其上叠加图形和动画。使用 Canvas,您只能使用该链接答案中描述的内容。 【参考方案1】:

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

或者直接在媒体播放器中使用marque选项here

对于文字以外的叠加层,你可以看看AbstractJWindowOverlayComponent

或者我还没有尝试过这种方法,你可以创建一个JLayeredPane,你的画布在第 1 层,并且可以让你的 JComponent 在第 0 层绘制你的叠加层,透明背景你可以覆盖它的paintComponent() 方法并绘制你需要的任何东西

【讨论】:

你最后的方法行不通。您不能将轻量级Swing 组件(例如JComponent)覆盖在重量级AWT 组件(例如Canvas)上。

以上是关于java-如何在画布上绘制消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何在画布上动画绘制线条

如何在画布上绘制并转换为位图?

如何将多个图像绘制到单个画布上?

如何在 Flutter 的画布上的路径内绘制图案?

如何使用 clearRect 不在画布上绘制移动对象

我们如何在 html5 画布上绘制调整大小的图像?