1
public void playMet() {

    int tempo = Integer.parseInt(met_speed.getText());
    tempo = tempo/60;
    int delay = tempo*1000; 

    if(Play.isSelected()) {
        try {
            FileInputStream in = new FileInputStream(new File("Click1.wav"));

            AudioStream as = new AudioStream(in);
            AudioPlayer.player.start(as);

            Thread.sleep(tempo*1000);
            playMet();

        } 
        catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }

    } 
    else
        System.out.println("not playing");
}

これが私のコードのセクションです。基本的にボタンが押されると、1分間にX回クリックが再生されます。

次のような while ループでコードを試しました。

while(Play.isSelected()) {
.........
.........
}

それもうまくいきませんでした。どちらの場合も、プログラムは正常に実行されますが、フリーズするため、タスク マネージャーからプログラムを終了する必要があります。

ボタンが押されたときに関数を呼び出し、選択を解除すると停止できるようにするにはどうすればよいですか?

PS以下の2つの投稿を見ました。仕事に行く必要があります。後でチェックして、機能するかどうかを確認します。お手伝いありがとう。

4

2 に答える 2

1

再帰呼び出しがEvent Dispatch Threadをブロックしています。EDT をブロックしないようにするには、新しいスレッドを作成する必要があります。

public void playMet()
{
    Thread t = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            while(Play.isSelected()){
                //Your code
            }
        }
    };
    t.start();
}
于 2014-11-29T18:40:11.170 に答える
1

Thread.sleep() は必要ありません。再帰や while ループも必要ありません。ステートフル プレーヤーが必要です。また、UI はプレーヤーの状態のみを変更する必要があります。

https://stackoverflow.com/a/7524627/2078908の例を参照してください。

private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture<?> playingTask;
private FileInputStream playing;

public void playMet() {
    stopPlaying();
    playingTask = executor.scheduleWithFixedDelay(new Runnable() {
        @Override
        public void run() {
            playMet();
        }
    }, 0, 1000, TimeUnit.MILLISECONDS);
}

public void playMetOnce(){
    try {
         IOUtils.close(playing);
         playing = new FileInputStream(new File("Click1.wav"));

         AudioStream as = new AudioStream(playing);
         AudioPlayer.player.start(as);
     } catch (Exception e)
     {
         JOptionPane.showMessageDialog(null, e);
     }
}

public void stopPlaying(){
    try {
        AudioPlayer.player.stop();
        IOUtils.close(playing);
        playing = null;
        if (playingTask != null) {
            playingTask.cancel(false);
        }
        playingTask = null;
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    }
}
于 2014-11-29T18:43:03.553 に答える