1

を使用して、プログラムにバックグラウンドオーディオを挿入しましたAudioInputStream

を押すとOn、バックグラウンドオーディオが再生され、バックグラウンドオーディオOffの再生が停止します。

これがオーディオ再生部分の私のコードの部分です:

public void playSound(int i)
{
    try 
    {
        .  //Others buttons sound
        .  //Others buttons sound
    if(i == 3 || i == 4)
    {
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("Background.wav"));
        Clip clip3 = AudioSystem.getClip( );
        clip3.open(audioInputStream);
        if(i == 3)
        {
            clip3.loop(Clip.LOOP_CONTINUOUSLY);
            clip3.start();
            settingSubMenuItem3.setEnabled(false);
            settingSubMenuItem4.setEnabled(true);
        }
        if(i == 4)
        {
            clip3.stop();
            settingSubMenuItem3.setEnabled(true);
            settingSubMenuItem4.setEnabled(false);
        }
    }
    catch(Exception e)
    {
        System.out.println("Error with playing sound.");
        e.printStackTrace();
    }
}

そしてここにそのButtonListener部分があります:

private class MenuItemListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == settingSubMenuItem3)
        {
            playSound(3);
        }
        if(e.getSource() == settingSubMenuItem4)
        {
            playSound(4);       
        }
    }
}

Onボタンを押すとコードで音声を再生できますが、Offボタンを押すと機能しません。

コンパイルおよび実行中にエラーは発生しません。

私のコードのエラーは何ですか?

4

1 に答える 1

4

AudioInputStream変数のaudioInputStreamとClip変数のclip3は、メソッドに対してローカルです。停止しようとしているオブジェクトは、現在再生しているオブジェクトと同じではありません。

それらをクラスフィールドにし、メソッドを呼び出す前にnullでないことを確認します。現在再生中のオブジェクトを停止しようとしている場合は、新しいオブジェクトを作成しないでください。問題はありません。

何かのようなもの:

public void playSound(int i) {
  try {
     // ...
     if (i == 3 || i == 4) {
        if (i == 3) {
           audioInputStream = AudioSystem
                 .getAudioInputStream(new File("Background.wav"));
           clip3 = AudioSystem.getClip();
           clip3.open(audioInputStream);
           clip3.loop(Clip.LOOP_CONTINUOUSLY);
           clip3.start();
           settingSubMenuItem3.setEnabled(false);
           settingSubMenuItem4.setEnabled(true);
        }
        if (i == 4) {
           if (clip3 != null && clip3.isActive()) {
              clip3.stop();
              settingSubMenuItem3.setEnabled(true);
              settingSubMenuItem4.setEnabled(false);
           }
        }
     }
  } catch (Exception e) {
     System.out.println("Error with playing sound.");
     e.printStackTrace();
  }
}

ここでも、audioInputStreamとclip3を非静的クラスフィールドにします。

余談ですが、3や4などの「マジック」番号を使用することは避けます。これは、6か月後にデバッグするのに悪魔になる可能性があるためです。代わりに、各JButtonに独自のアクションを与えます。それ以上の価値があります。

于 2012-05-19T16:10:48.473 に答える