2017-04-14 11 views
0

パブリッククラスA2 {私が遭遇した問題は、非常に単純ではなく、複雑で、その動作

public class B implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Fing"); 
    } 
} 

public class C implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Fang"); 
    } 
} 

public class D implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Foom"); 
    } 

} 

public A2(){ 
    JButton a = new JButton("Fing"); 
    JButton b = new JButton("Fang"); 
    JButton c = new JButton("Foom"); 

    a.addActionListener(new B()); 
    b.addActionListener(new C()); 
    c.addActionListener(new D()); 


} 

public static void main(String[] args) { 
    A2 a2 = new A2(); 

} 

を変更することなく、その読みやすさが改善されるようにコードを書き換えます。私はその機能を修正せずにコードを短縮したい。たとえば、コードは多くのactionlistenersとactionperformedに表示されていますが、私はSystem.out.println()を取り出すクラスを1つ作成しようとしていました。その上に文字列値を入れます。ただし、コーディングはこの単純な方法では機能しません。このコードを単純化して読みやすくするために私を助けてください。ありがとう。

+4

使用ラムダの数によってサポートされ、むしろ柔軟なAPIです。 '' a.addActionListener(e - > {System.out.println( "Fing");}); 'など –

答えて

1

あなたは、以下のようにimplements ActionListener単一のクラスMyActionListenerを定義することができます

public class MyActionListener implements ActionListener { 

    private String input; 

    public MyActionListener(String input) { 
     this.input = input; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println(input); 
    } 
} 

public A2(){ 

    String[] inputs = {"Fing","Fang","Foom"};//Array of JButton inputs 
    for(int i=0;i<inputs.length;i++) { 
     JButton jButton = new JButton(inputs[i]);//create JButton instance 
     jButton.addActionListener(new MyActionListener(inputs[i])); 
    } 
} 
+0

これはいいですね、JButtonも同様に短縮できますか? –

+0

これで、4行しか表示されず、任意の数の 'JButton'を作成できます。 – developer

2

それはあなたが、私は時々、あなたがする必要があり、個人的に自己文書化コードのファンだ何ができるか、物事を知ることは不可能ですソリューションを最適化しようとするときは注意してください。

私が最初に考えたのはactionPerformedメソッドをオーバーライドし、あなたが必要な場合は、さらに多くのカスタマイズを提供するために、それを拡張することができ、作業

public class CommonAction extends AbstractAction { 

    public CommonAction(String name) { 
     putValue(NAME, name); 
     putValue(SHORT_DESCRIPTION, "This is a tool tip for " + name); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println(getValue(NAME)); 
    } 

} 

の自己完結型のユニットを設計することを可能にする、Action's APIで開始するかもしれませんしかし、それはあなた次第です。

その後、あなたは自分のボタンに適用する必要があります...

public class A2 { 

    public A2() { 
     JButton a = new JButton(new CommonAction("Fing")); 
     JButton b = new JButton(new CommonAction("Fang")); 
     JButton c = new JButton(new CommonAction("Foom")); 
    } 

} 

またはあなたのメニューのか、あなたのキーバインド、Actionは、他のコンポーネント

関連する問題