Odtwarzacz mp3

0

Witam, chciałem napisać prosty program do odtwarzania plików mp3. Mam problem z poprawnym działaniem mojego programu gdyż, po naciśnięciu przycisku "Play" nic już nie da sie zrobić tzn. nie da się kliknąć żadnego innego przycisku. Jeśli ktoś mógłby mi doradzić jak z tym sobie poradzić byłbym ogromnie wdzięczny. Pozdrawiam
Tutaj jest kod Mp3Playera:

package com.hubberspot.example;
 
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
 
 
public class Mp3Player {
    
    private String filename;
    private Player player;
 
 
    public Mp3Player(String filename) 
    {
    	this.filename = filename;
    }
    public void play() 
    {
    	try 
    	{  
    		BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(filename));
    		player = new Player(buffer);
    		player.play();
    	}
    	catch (Exception e) 
    	{
    		System.out.println(e);
    	}
    }
    }

a tutaj kod ramki:

package com.hubberspot.example;

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Ramka extends JFrame 
{
	private JPanel contentPane;
	public static void main(String[] args) 
	{
		EventQueue.invokeLater(new Runnable() 
		{
			public void run() 
			{
				try 
				{
					Ramka frame = new Ramka();
					frame.setVisible(true);
				} 
				catch (Exception e) 
				{
					e.printStackTrace();
				}
			}
		});
	}
	private JButton btnPlay, btnStop;
	Mp3Player mp3 = new Mp3Player("C:\\Documents and Settings\\dell\\Moje dokumenty\\Downloads\\song.mp3");
	public Ramka() 
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
	    btnPlay = new JButton("Play");
		btnPlay.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
			    	mp3.play();
			}
		});
		btnPlay.setBounds(155, 127, 89, 23);
		contentPane.add(btnPlay);
		
		btnStop = new JButton("Stop");
		btnStop.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				dispose();
			}
		});
		btnStop.setBounds(155, 161, 89, 23);
		contentPane.add(btnStop);
	}
}

1

Widocznie klasa Player nie tworzy przy odtwarzaniu muzyki nowego wątku. Musisz wywołanie metody play() umieścić w nowym wątku.
Prosty sposób korzystający z klasy SwingWorker:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
import javax.swing.*;
 
public class Mp3Player extends SwingWorker<String,Object>
{
    
    private String filename;
    private Player player;
  
    public Mp3Player(String filename) 
    {
    	this.filename = filename;
    }
    public String doInBackground() 
    {
    	try 
    	{  
    		BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(filename));
    		player = new Player(buffer);
    		player.play();
    	}
    	catch (Exception e) 
    	{
    		System.out.println(e);
    	}
        return "";
    }
}
...
btnPlay.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
        mp3.execute();
    }
});
0

Dzięki wielkie, wszystko pięknie działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1