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"
。我尝试使用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 方法来实现您的目标? 可能与您的问题有关:***.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-如何在画布上绘制消息?的主要内容,如果未能解决你的问题,请参考以下文章