2012-01-17 9 views
2

私は現在、押されると配列の要素をその値で更新し、その要素を含むフレームを閉じた一連のボタンを持っています。多くのボタンが似たような作業をします - actionPerformedを単純化する方法はありますか?

現在、彼らの行動は、次のように述べられている:

... 
svwnb.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      input[5] = svwnb.getText(); 
      dftframe.setVisible(false); 
     } 
    }); 
    blypb.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      input[5] = blypb.getText(); 
      dftframe.setVisible(false); 
     } 
    }); 
    pw91b.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      input[5] = pw91b.getText(); 
      dftframe.setVisible(false); 
     } 
    }); 
    b97db.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      input[5] = b97db.getText(); 
      dftframe.setVisible(false); 
     } 
    }); 
    pbepbesolb.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      input[5] = pbepbesolb.getText(); 
      dftframe.setVisible(false); 
     } 
    }); 
... 

簡単な方法にこれを簡素化する方法はありますか?私はgetSource()メソッドを使用する必要があると感じていますが、このようなアクションメソッドを構築する経験はありません。私はこのコードを生成する方法を正確に知らない

public void actionPerformed(ActionEvent e){ 
    input[5] = e.getSource().getText(); 
    dftframe.setVisible(false); 
} 

より簡潔にするために、私は、コードは次の擬似コードのようになりますという考えを持っています。

答えて

2

あなたは次のようにActionListenerを定義することができます。

ActionListener commonListener = new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 
     Object o = e.getSource(); 
     if (o instanceof JTextField) { 
      JTextField textField = (JTextField)o; 
      input[5] = textField.getText(); 
      textField.setVisible(true); 
     } 
    } 
}; 

、各コンポーネントに追加して使用します。バックソースオブジェクトで探し

svnwnb.addActionListener(commonListener); 
... 
+0

@AndrewThompson Yep。それは醜いです。私は、質問者が自分のクラスにActionListener型の(プライベート)フィールドを定義できると言っていました。私はそれを編集します。ありがとうございました。 – MockerTim

+0

ありがとう、これは完全に働いた。非常に高く評価しました – user1147964

+0

@MockerTimご清聴ありがとうございます。良い編集、優れた答え。 :) –

1

あなたの疑似コードに余分なeがあります。それ以外のものは正常に動作します。

input[5] = e.getSource().e.getText(); 
         ^

これは(それが必要とされているかどうかわからない)

input[5] = e.getSource().getText(); 

あなたは

input[5] = ((JButton)e.getSource()).getText(); 

がありe.getSource()のようなものに余分なキャストが必要になることがありますする必要があります使用できるActionEventのgetActionCommandメソッドもありますが、ボタンに適切なactionCommandが設定されている場合にのみ機能します。

+0

提案した方法を使用する場合、このプログラムにはどのような構造が使用されますか? 各ボタンには、引数内にactionPerformedメソッドを付けて.addActionListenerを追加しています。 これに対応するためにプログラムをどのように再構築しますか?ありがとうございます – user1147964

+1

複数のアクションリスナーは必要ありません。 1つのActionListenerインスタンスのみを作成し、同様のアクションですべてのボタンに追加します。次にactionPerformedで疑似コードを使用します。 –

+0

_それが必要かどうかわからない_なぜあなたは確かではありませんか? getSourceの型は文書化されています:-) – kleopatra

-1

は本当に汚いです。それを除けば、情報源はしばしば驚くべきこと、または文書化されていない。ただ、各ボタンのリスナーの別のインスタンスを使用します。

addTextAction(svwnb); 
    addTextAction(blypb); 
    addTextAction(pw91b); 
    addTextAction(b97db); 
    addTextAction(pbepbesolb); 
    ... 

private void addTextAction(final AbstractButton button) { 
    button.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      input[5] = button.getText(); 
      dftframe.setVisible(false); 
     } 
    }); 
} 

(テキストとボタンのリンクが少し厄介なようだあなたはそれをハックしようとする場合、はるかに少ないので(つまり、ここで分割する方法を明らかにする必要があります)イベントソースを取得することによって)。

+2

なぜこれがリスナーの単一のインスタンスより優れていると思いますか?質問のリスナーの目的は、各フィールドで同じです。イベントのソースのみが変化します。 – MockerTim

+0

Downvote。あなたの答えにはぎこちないものが含まれています。私はまた、ここで誰もがダウンボートの理由を説明すべきだと思う。 – MockerTim

関連する問題