使JPanel背景透明,不会出现文本重叠

时间:2013-06-25 03:38:17

标签: java swing jpanel jtextfield transparent

我正在制作一个类似于字幕播放器的内容,它会覆盖视频。

我想使背景透明,以便文本所在的框不会干扰在其后面播放的电影/电视节目。我已经尝试了两种方法来实现这一点,每种方式都会导致同样的问题。下一句出现时,文本不会消失。如果背景是一种颜色(例如:Color.red),那么这很好。一段时间后,我调用text.setText(“下一句”),但这不适用于透明背景。相关代码如下。 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);

1 个答案:

答案 0 :(得分:2)

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