-1

Javaでmp3ファイルを再生するプログラムを作りました。次のコードは mp3 ファイルを再生しますが、再生中に停止できません... 2 つの別々の ActionListener を 2 つのボタンに追加しましたが、停止ボタンでは機能しません...

import java.io.*;    
import javax.swing.*;
import java.awt.event.*;
import javazoom.jl.player.Player;  
import java.io.FileInputStream;



    public class Play2 extends JFrame
    {  
    JButton b,b1;
    JTextField t;

    Play2()
    {
        JFrame j=new JFrame("MusicPlayer");
        j.setSize(300,300);
        j.setDefaultCloseOperation(EXIT_ON_CLOSE);
        b=new JButton("Play");
        b1=new JButton("Stop");
        JPanel p=new JPanel();
        t=new JTextField(20);
        p.add(t);
        p.add(b);
        p.add(b1);
        j.add(p);
        j.setVisible(true);


    }
    public void awt()
    {
    b.addActionListener(
            new ActionListener(){
                  public void actionPerformed(ActionEvent ae){
                try  
                    {  

            String fname=t.getText();
            File directory = new File(fname);

            boolean isDirectory = directory.isDirectory();

            if (isDirectory) 
             {
                    // It returns true if directory is a directory.
                System.out.println("the name you have entered is a directory  : "  +  directory);  
                    //It returns the absolutepath of a directory.
                    System.out.println("the path is "  +  directory.getAbsolutePath());
             }
            else
            {
                    // It returns false if directory is a file.
                System.out.println("the name you have entered is a file  : " + directory);
                    //It returns the absolute path of a file.
                    System.out.println("the path is "  + directory.getAbsolutePath());
            }
                String s=directory.getAbsolutePath();

                s=s.replace("\\","/") ;

                    FileInputStream fis=new FileInputStream(s);  
                    final Player playMp3=new Player(fis);  

                    playMp3.play(); 
        }
        catch(Exception e){
            System.out.println(e);}
        }//end actionPerformed
      }//end ActionListener
    );//end addActionListener()

    b1.addActionListener(
      new ActionListener(){
        public void actionPerformed(
                                  ActionEvent ae){
          //Terminate playback before EOF
                    try  
                    {  

            String fname=t.getText();
            File directory = new File(fname);

            boolean isDirectory = directory.isDirectory();

            if (isDirectory) 
             {
                    // It returns true if directory is a directory.
                System.out.println("the name you have entered is a directory  : "  +  directory);  
                    //It returns the absolutepath of a directory.
                    System.out.println("the path is "  +  directory.getAbsolutePath());
             }
            else
            {
                    // It returns false if directory is a file.
                System.out.println("the name you have entered is a file  : " + directory);
                    //It returns the absolute path of a file.
                    System.out.println("the path is "  + directory.getAbsolutePath());
            }
                String s=directory.getAbsolutePath();

                s=s.replace("\\","/") ;

                    FileInputStream fis=new FileInputStream(s);  
                    final Player playMp3=new Player(fis);  

                    playMp3.close(); 
        }
        catch(Exception e){
            System.out.println(e);}
        }//end actionPerformed
      }//end ActionListener
    );//end addActionListener()

    }


        public static void main(String[]args)  
        {  
        Play2 f=new Play2();
        f.awt();    
    }

}  
4

1 に答える 1

0

ここで行っているのは、再生ボタン リスナーで EDT (イベント ディスパッチ スレッド) を占有することです。

[再生] ボタンをクリックすると、ActionEvent がイベント キューにポストされます。その後停止ボタンを押すと、別の ActionEvent が EventQueue にポストされます。

EDT は、イベント キュー内の最初のイベント (再生イベント) の処理を​​開始します。その場合、EDTplay()の (mp3) クラスでメソッドを呼び出します。Playerこのplay()メソッドは、mp3 全体が再生されるまでループし続けます。この間、もう一方のイベント (停止イベント) は、順番が実行されるのをイベント キューで待機します。そのため、最終的に停止イベントを実行する番になったとき、mp3 は既に最後まで再生されており、停止コマンドはかなり冗長です。


主な問題: EDT で長いタスクを実行しないでください。

解決策: SwingWorker クラスを使用してメソッドを呼び出すことにより、play メソッドが非 EDT スレッドで実行されるようにしPlayer.play()ます。

参照: Swing UI のイベント ディスパッチ スレッド ルール (オンライン記事) (これを読むのは興味深いかもしれません。特に、この特定の問題に関する情報を含む「EDT を遅らせない」セクションの情報)

于 2013-01-15T15:15:38.323 に答える