2012-03-12 12 views
0

私は電話機をコーディングしようとしています。最初に押したボタンごとに異なるサウンドを割り当てることをやりました。JSwing - 異なるパラメータ値を持つイベントハンドラを使用する

私は、このいずれかのように10件のハンドラ書きたくない:私はStringパラメータ(wavファイルへのルートを)受け入れるユニークなハンドラを、使用したい、代わりに

private void buttonOneHandler(java.awt.event.MouseEvent evt) { 

    try{ 

     buttonSound = AudioSystem.getClip(); 
     AudioInputStream ais = AudioSystem.getAudioInputStream(new File("resources/buttonOne.wav")); 
     buttonSound.open(ais); 
     buttonSound.loop(0); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

を、各ボタンはgetAudioInputStreamのパラメータ値を変更します。

これは可能ですか? ありがとうございます。

答えて

0
private static class PlaySoundActionListener implements ActionListener { 

    private String soundPath; 

    private PlaySoundActionListener(String soundPath) { 
     this.soundPath = soundPath; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // play the sound at this.soundPath 
    } 
} 

... 

button1.addActionListener(new PlaySoundActionListener("resources/buttonOne.wav")); 
button2.addActionListener(new PlaySoundActionListener("resources/buttonTwo.wav")); 
button3.addActionListener(new PlaySoundActionListener("resources/buttonThree.wav")); 

ノートのMouseListenerはボタンで使用する適切なリスナーではないこと。 ActionListenerは、ボタンがクリックされたとき、およびクリックされた方法(マウス、キーボード、キーボードショートカット)に関係なく呼び出されるActionListenerです。

+0

そこに行く、JB Nizet!今それは働いている。しかし、あなたのコードに関して2つの質問があります(答えが明白な場合は私には納得してください):1)なぜprivateコンストラクタを持っていますか? 2)下位コード(addActionListener)はどこに置くことをお勧めしますか?内部のカスタム初期化メソッド? また、MouseListenerの使用を避けることについての有益な感謝のおかげで、ありがとうございます。そうです。 もう一度、ありがとうございます! – ilMarto

+0

プライベートクラスにあるので、プライベートコンストラクタを持っています。したがって、たとえコンストラクタが公開されていても、それは囲むクラスからしかアクセスできません。しかしそれはあまり重要ではありません。アクションリスナーを追加することは実際にパネル/ダイアログ/フレームの初期化の一部になるはずです。 –

0

これは、単一のActionListenerを記述し、各ボタンに登録することで可能です。 次に、JButton(Action)コンストラクターを使用して、ボタンがカスタムアクションを生成するようにする必要があります。

これはスイングのチュートリアルでカバーされています http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html

+0

ああ、ありがとうございました。それは本当に有用で正しいものでした。私は前にそのチュートリアルに行っておくべきだった。再度、感謝します! – ilMarto

関連する問題