質問: AudioSystem.getClip(); line.open(ais); line.start(); System.out.println("Playing..."); Thread.sleep(0); line.drain(); line.stop(); line.close(); System.out.println("Sound End"); ``` ### 試したこと 再生停止をするため、.startをbtnのなかに記載したり等 ### 補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報
回答: きっと動きとしては、以下のような感じになっているのではないでしょうか? ``` class なんかのクラス { なんかのクラス() { JButton playButton = new JButton("Play"); playButton.addActionListener(ev -> { ファイルを選び音声ファイルをロードして再生開始 drainで再生が完全に終わるまでスレッドをブロック }); JButton stopButton = new JButton("stop"); stopButton.addActionListener(ev -> { さてplayButtonで再生を完全に制御している音声再生をどうやって止めたらいいの...??? }); } } ``` もしそうならこの構造では再生停止は実装できません。問題は質問者さんご自身で言っておられる通り「Playボタンのハンドラーが再生終了まで処理が終わらないように実装されていること」です。今のままだと再生が完了するまでUIが完全にブロックすると思います。音声再生が完了するまで画面が全然反応しなくなるのではないですか?(プログラムコードの構造が明確に述べられていないので単なる想像ですが) これを改め、「Playボタンのハンドラーは再生を開始するが完了をまたないようにする」ことが第一歩だと思います。drainなどの同期的な制御を止めて再生自体はDataLineにまかせPlayボタンのハンドラーから速やかにreturnしてください。playしておきさえすればDataLineが勝手に再生してくれます。 こうして、Playボタンのハンドラーからreturnすると、UIが再びユーザー操作を受け付けるようになりますので、Stopボタンのハンドラーも起動できるようになります。Stopボタンのハンドラーでは再生中のDataLineに対してstopを呼び出して再生を停止すればお望みの機能は実現できると思います。