【问题标题】:Make JPanel background transparent without text overlapping使 JPanel 背景透明而没有文本重叠
【发布时间】:2013-06-21 17:51:29
【问题描述】:

我正在制作类似于字幕播放器的东西,可以播放视频。

我想让背景透明,这样文本所在的框就不会干扰后面播放的电影/电视节目。我尝试了两种方法来做到这一点,每种方法都会导致同样的问题。当下一个句子出现时,文本不会消失。如果背景是一种颜色(例如:Color.red),那么这可以正常工作。一段时间后,我调用 text.setText("next sentence"),但这不适用于透明背景。相关代码如下。 text 是一个 JTextField

我应该提到该视频不在此程序中。这个节目只有字幕。

第一种方式:

text.setBackground(new Color(0,0,0,0));

第二种方式:(使用透明图片)

Graphics c = myPicture.getGraphics();
text.paintAll(c); 

我这样更新文本。

Thread.sleep(Graphix.subtitles.get(counter).getStart());
text.setText(Graphix.subtitles.get(counter).getText());

这也使它重叠。

text.setForeground(Color.blue);
text.setBackground(new Color(0,0,0,0));
text.setOpaque(false);

Main的相关代码如下。

final JFrame JFwindow = new JFrame("Subtitles");
JFwindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
JFwindow.getContentPane().add(new Subtitles()); 
JFwindow.setSize(1300, 150);
JFwindow.setUndecorated(true);
JFwindow.setBackground(new Color(0,0,0,0f));
JFwindow.pack();
JFwindow.setVisible(true);

【问题讨论】:

  • 您的视频播放效果如何?您如何使JPanel 透明?你在面板上调用“重绘”吗?
  • 已更新信息!
  • text is a JTextField - 我会使用 JLabel。默认情况下,标签是透明的,用于显示文本。 JTextField 用于编辑/键入文本。

标签: java swing jpanel jtextfield transparent


【解决方案1】:
  • 通过调用JPanel#setOpaque 并传递false 来实现透明度。
  • 你永远不应该打电话给getGraphicsgetGraphics 并返回 null,充其量只是作为快照。一旦RepaintManager 开始一个新的绘制周期,绘制到它的结果将被覆盖。
  • 使用 tarnsparent 颜色只会混淆 RepaintManager,因为它不知道它需要在组件下绘制
  • 在事件调度线程 (EDT) 中休眠将阻止 Swing 执行任何更新(以及处理任何事件)。相反,我建议使用javax.swing.Timer。有关详细信息,请参阅Concurrency in Swing
  • 如果您使用的是 VLC 绑定,则无法实现
  • 不要忘记使包含子标题的所有父容器也透明

【讨论】:

  • 嗯,所以我现在看起来必须重做才能实现我的尝试?定时器应该解决这个问题?
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多