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

标签: java swing canvas awt


【解决方案1】:

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

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

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

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

【讨论】:

  • 你最后的方法行不通。您不能将轻量级Swing 组件(例如JComponent)覆盖在重量级AWT 组件(例如Canvas)上。
猜你喜欢
  • 2016-10-11
  • 2011-08-16
  • 2021-07-15
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
相关资源
最近更新 更多