xhw951122 2015-04-18 02:15 采纳率: 0%
浏览 2235

写了一个简单的MP3,用一个线程完成从文件中读出歌词,无法显示是怎么回事?

RT,原来用一个函数完成歌词的读取,可以显示,现在我用一个线程来完成同样的功能,代码都是完全从那个函数中复制过去的,结果无法显示,控制台中也无法输出,求解
以下是代码:
package app;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Vector;

import javax.media.Manager;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class PlayFrame extends JFrame implements Runnable {
Player player;
Vector playlist;
Thread readlyric;
BufferedReader br;
String filedirectory = "file:1.mp3";
int position = 0;

JLabel musicname;
JTextArea lyric;
JPanel panellyric, panelbutton;
JButton playmusic, pausemusic, next, last;

Font x = new Font("Serif", Font.ITALIC + Font.BOLD, 16);

public PlayFrame() {
    try {
        br = new BufferedReader(new InputStreamReader(new FileInputStream(
                "1.lrc"), "UTF-8"));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    playlist = new Vector();
    playlist.add("file:1.mp3");
    playlist.add("file:2.mp3");

    this.setTitle("MP3");
    this.setBounds(400, 100, 350, 550);

    musicname = new JLabel("Music_Name", JLabel.CENTER);
    musicname.setFont(x);
    panellyric = new JPanel();
    panelbutton = new JPanel();

    lyric = new JTextArea(25, 25);
    lyric.setEditable(false);
    lyric.setBackground(Color.WHITE);
    lyric.setLineWrap(true);// 确定是否能在右边界自动换行

    last = new JButton("Last");
    playmusic = new JButton("Play");
    pausemusic = new JButton("Pause");
    next = new JButton("Next");

    playmusic.addActionListener(play_button);
    pausemusic.addActionListener(stop_button);
    next.addActionListener(next_button);
    last.addActionListener(last_button);

    panellyric.add(lyric);
    panelbutton.add(last);
    panelbutton.add(playmusic);
    panelbutton.add(pausemusic);
    panelbutton.add(next);

    this.add(musicname, BorderLayout.NORTH);
    this.add(panellyric, BorderLayout.CENTER);
    this.add(panelbutton, BorderLayout.SOUTH);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}


public ActionListener play_button = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        display();
        //read();
        musicname.setText(filedirectory);
    }
};

public ActionListener stop_button = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        pause();
    }
};

public ActionListener next_button = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        next();
    }
};

public ActionListener last_button = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        last();
    }
};

public void display() {

    try {
        player = Manager.createPlayer(new URL(filedirectory));
        readlyric=new Thread();
    } catch (NoPlayerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    player.start();
    readlyric.start();

}

public void pause() {
    player.stop();
    readlyric.stop();
}

public void next() {
    pause();
    if (position < playlist.size()) {
        filedirectory = playlist.get(++position).toString();
    } else {
        position = 0;
        filedirectory = playlist.get(position).toString();
    }
    display();
}

public void last() {
    pause();
    if (position > 0) {
        filedirectory = playlist.get(--position).toString();
        display();
    } else {

    }
}

@Override
public void run() {
    // TODO Auto-generated method stub
    System.out.println("enter method run");
    int lastTime = 0;
    int minute, second, milliSecond, total;
    String str = "", time, words;

    try {
        while ((str = br.readLine()) != null) {
            // 获取'[]'中的时间字符串
            time = str.substring(str.indexOf('[') + 1, str.indexOf(']'));
            minute = Integer.parseInt(time.substring(0, time.indexOf(':')));
            second = Integer.parseInt(time.substring(time.indexOf(':') + 1,
                    time.indexOf('.')));
            milliSecond = Integer
                    .parseInt(time.substring(time.indexOf(".") + 1));
            // 计算总时间
            total = minute * 60 * 1000 + second * 1000 + milliSecond * 10;

            Thread.sleep(total - lastTime);

            System.out.println("get lyric");
            // 将歌词前面的时间信息去掉,在控制台输出歌词
            words = str.substring(str.indexOf("]") + 1);

            System.out.println(words);
            lyric.append(words);
            lyric.append("\n");
            // 立即绘制指定区域
            lyric.paintImmediately(lyric.getBounds());

            lastTime = total;
        }
    } catch (NumberFormatException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

// public void read() {
//
// int lastTime = 0;
// int minute, second, milliSecond, total;
// String str = "", time, words;
//
// try {
// while ((str = br.readLine()) != null) {
// // 获取'[]'中的时间字符串
// time = str.substring(str.indexOf('[') + 1, str.indexOf(']'));
// minute = Integer.parseInt(time.substring(0, time.indexOf(':')));
// second = Integer.parseInt(time.substring(time.indexOf(':') + 1,
// time.indexOf('.')));
// milliSecond = Integer
// .parseInt(time.substring(time.indexOf(".") + 1));
// // 计算总时间
// total = minute * 60 * 1000 + second * 1000 + milliSecond * 10;
//
// Thread.sleep(total - lastTime);
//
// // 将歌词前面的时间信息去掉,在控制台输出歌词
// words = str.substring(str.indexOf("]") + 1);
//
// System.out.println(words);
// lyric.append(words);
// lyric.append("\n");
// // 立即绘制指定区域
// lyric.paintImmediately(lyric.getBounds());
//
// lastTime = total;
// }
// } catch (NumberFormatException | IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }

public static void main(String[] args) {

    PlayFrame playframe = new PlayFrame();

}

}

  • 写回答

2条回答 默认 最新

  • devmiao 2015-04-18 03:53
    关注

    调试下,线程中的代码有没有被执行

    评论

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler