2013-06-25 4 views
2

Я делаю что-то похожее на проигрыватель субтитров, который будет просматривать видео.Сделать JPanel фоном прозрачным без перекрытия текста

Я хотел бы сделать фон прозрачным, чтобы ящик, в котором находится текст, не будет мешать воспроизведению фильма/телешоу за ним. Я пробовал два способа сделать это, и каждый из них приводит к одной и той же проблеме. Текст не исчезает при появлении следующего предложения. Если фон является цветом (например: Color.red), то это отлично работает. Через некоторое время я вызываю text.setText («следующее предложение»), но это не работает с прозрачным фоном. Соответствующий код выглядит следующим образом. текст - это 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

Как поживаете воспроизводить видео? Как вы делаете «JPanel» прозрачным? Вы вызываете 'repaint 'на панели? – MadProgrammer

+0

Обновлено с информацией! – Yesha

+1

' text - это JTextField' - я бы использовал JLabel. Ярлык по умолчанию прозрачен и используется для отображения текста. JTextField используется для редактирования/ввода текст – camickr

ответ

2
  • Прозрачность достигается путем вызова JPanel#setOpaque и передавая ему false.
  • Вы НИКОГДА не должны звонить getGraphics. getGraphics и вернуть null и, в лучшем случае, только как съемка. Как только RepaintManager начнет новый цикл рисования, результаты его рисования будут отменены.
  • Использование цвета tarnsparent только запутать RepaintManager, поскольку он не будет знать, что ему нужно рисовать по компоненту
  • Спящий в Event Диспетчерская тему (EDT) остановит Качели от выполнения каких-либо обновления (а также процесс любые события). Вместо этого я бы рекомендовал использовать javax.swing.Timer. См. Concurrency in Swing для более подробной информации.
  • Если вы используете привязок VLC, то она не может быть достигнуто
  • Не забудьте сделать все родительские контейнеры, что суб названия, содержащиеся в прозрачном, а также
+0

Хм, так что у меня сейчас выглядит так, что нужно было бы переделать, чтобы добиться того, что я пытаюсь? Таймер должен решить это? – Yesha

+0

Таймер поможет ... – MadProgrammer

+0

Хорошо, я рассмотрю это . Спасибо! – Yesha