/** * 文件名:LrcScrollPane.java * 环境: GNU/Linux Ubuntu 7.04 + Eclipse 3.2 + JDK 1.6 * 功能:滚动的Lrc歌词显示面板 * 版本:0.0.2.0 * 作者:88250 * 日期:2007.4.28 * E-mail & MDN: DL88250@gmail.com * QQ:845765 */ import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import javax.swing.JPanel; import java.util.Date; public class LrcScrollPane extends JPanel { private final int heightOfChar = 20; private final Font fontOfChar = new Font("monospaced", Font.BOLD, 14); private Point scrollPoint; // 参考点,会慢慢向上移。 private LrcAnalystBase lrcAnalyst; private static int lrcIndex = 0; public LrcScrollPane() { lrcAnalyst = new LrcAnalystBase(); lrcAnalyst.readFile("六月的雨.lrc"); lrcAnalyst.parseLyrics(); scrollPoint = new Point(5, getSize().height); } /** * 实现歌词的滚动显示 */ public void scroll() { Date startTime = new Date(); for (int i = 0; i < lrcAnalyst.getLrcTimeValAndIndex().size(); i++) { while (true) { try { Thread.currentThread().sleep(50); Date currentTime = new Date(); LrcTimeAndIndexNum fl = (LrcTimeAndIndexNum) (lrcAnalyst .getLrcTimeValAndIndex().get(i)); float diffTime = currentTime.getTime() - startTime.getTime(); lrcIndex = fl.getLrcIndex()- lrcAnalyst.getRealLrcStartOffset(); if (fl.getLrcTime() - (float) diffTime / 1000 < 0.0) { scrollPoint.y--; //System.out.println((String) lrcAnalyst.getLrcContent().get( // fl.getLrcIndex()- lrcAnalyst.getRealLrcStartOffset())); repaint(); break; } } catch (Exception e) { e.printStackTrace(); } } } } public void paintComponent(Graphics brush) { // 用背景色覆盖,原来的文字就看不到了。再写上新的文字,由于视觉停留, // 看起来文字就会滚动 brush.setColor(getBackground()); brush.fillRect(0, 0, getSize().width, getSize().height); brush.setColor(Color.blue); brush.setFont(fontOfChar); // i为下标,用来历遍歌词缓存容器, // 当scrollPoint.y+(heightOfChar*i)<0 时,会把文字写到面板上方,看不见。 // 没有必要显示。 // scrollPoint.y+(heightOfChar*i)=0 => i=(-scrollPoint.y/heightOfChar) // 故要使(-scrollPoint.y/heightOfChar)和 0 作比较,要是小于0,i取0 /*int i = 0; if ((-scrollPoint.y / heightOfChar) > 0) { i = (-scrollPoint.y / heightOfChar); }*/ /*String lyrics = null; for (; i < lrcAnalyst.getLrcContent().size(); i++) { // 当条件成立,文字会写到面板下方,也没有必要显示,跳出循环 if (scrollPoint.y + (heightOfChar * i) > getSize().height) { break; } lyrics = (String) (lrcAnalyst.getLrcContent().get(i)); // 见scroll(),靠scrollPoint.y的上移,使文字上移 brush.drawString(lyrics, scrollPoint.x, scrollPoint.y + (heightOfChar * i)); } */ String lyrics = (String) lrcAnalyst.getLrcContent().get(lrcIndex); // 见scroll(),靠scrollPoint.y的上移,使文字上移 brush.drawString(lyrics, scrollPoint.x, -scrollPoint.y + 20); } }