2011-12-20 6 views
0

JTextFieldフォーカスリスナー用のJavaでクラスを作成しましたが、このクラスをジェネリッククラスとして書き込む方法がわかりません。ジェネリッククラスを作成したら、JTextFieldのすべてで使用する必要があります。どうやってこれを行うことができますか?コーディング方法を教えてください。この次のコードのための一般的なクラスを作成する方法:Javaプログラムのジェネリッククラスを作成する

package javaapplication7; 
import java.awt.FlowLayout; 
import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.text.JTextComponent; 

public class testfocuss{ 
    public static void main(String[] argv) throws Exception { 

    JTextField component = new JTextField(20); 
    JTextField component1 = new JTextField(20); 
    JTextField component2 = new JTextField(20); 
    JTextField component3 = new JTextField(20); 
    component.addFocusListener(new MyFocusListener()); 
    component1.addFocusListener(new MyFocusListener()); 
    component2.addFocusListener(new MyFocusListener()); 
     component3.addFocusListener(new MyFocusListener()); 
    JFrame f = new JFrame(); 
    f.layout(new FlowLayout()); 
    f.add(component1); 
    f.add(component); 
    f.add(component2); 
     f.add(component3); 
    f.pack(); 
    f.setVisible(true); 

    } 
} 
class MyFocusListener extends FocusAdapter { 
    //boolean showingDialog = false; 

    public void focusGained(FocusEvent evt) { 
    final JTextComponent c = (JTextComponent) evt.getSource(); 
    String s = c.getText(); 
    c.requestFocus(); 
    c.selectAll(); 

    for (int i = 0; i < s.length(); i++) { 
    if (!Character.isDigit(s.charAt(i))) { 
    c.setSelectionStart(i); 
     c.setSelectionEnd(i); 
     break; 
    } 
    } 
    } 

    public void focusLost(FocusEvent evt) { 
    final JTextComponent c = (JTextComponent) evt.getSource(); 
    String s = c.getText(); 

    if (evt.isTemporary()) { 
    return; 
    } 
    for (int i = 0; i < s.length(); i++) { 
    if (!Character.isDigit(s.charAt(i))) { 
     //System.out.println("must only contain digits"); 
     c.requestFocus(); 
     c.selectAll(); 
     break; 
     } 
    } 

} 
} 
+1

何を正確にあなたが一般的なようにしたいですか?フォーカスリスナーは、すべての 'JTextComponents'に対してすでに動作しています。 – socha23

+0

これは正常に動作します。フォーカスリスナーをジェネリッククラスとして記述する方法と、ジェネリッククラスをJTextFieldを持つ他のプログラムで使用する方法です。 – Ayesha

+0

+1、そこにジェネリック医薬品は必要ありません。キャストする前のインスタンスは良いことです。 –

答えて

1

はこの1

package javaapplication7; 

    import java.awt.FlowLayout; 
    import java.awt.event.FocusAdapter; 
    import java.awt.event.FocusEvent; 
    import javax.swing.JFrame; 
    import javax.swing.JTextField; 
    import javax.swing.text.JTextComponent; 

    public class testfocuss { 
     public static void main(String[] argv) throws Exception { 

      JTextField component = new JTextField(20); 
      JTextField component1 = new JTextField(20); 
      JTextField component2 = new JTextField(20); 
      JTextField component3 = new JTextField(20); 
      MyFocusListener l = new MyFocusListener(); 
      component.addFocusListener(l); 
      component1.addFocusListener(l); 
      component2.addFocusListener(l); 
      component3.addFocusListener(l); 
      JFrame f = new JFrame(); 
      f.setLayout(new FlowLayout()); 
      f.add(component1); 
      f.add(component); 
      f.add(component2); 
      f.add(component3); 
      f.pack(); 
      f.setVisible(true); 

     } 
    } 

    class MyFocusListener<C extends JTextComponent> extends FocusAdapter { 
     // boolean showingDialog = false; 

     public void focusGained(FocusEvent evt) { 
      final C c = (C) evt.getSource(); 
      String s = c.getText(); 
      c.requestFocus(); 
      c.selectAll(); 

      for (int i = 0; i < s.length(); i++) { 
       if (!Character.isDigit(s.charAt(i))) { 
        c.setSelectionStart(i); 
        c.setSelectionEnd(i); 
        break; 
       } 
      } 
     } 

     public void focusLost(FocusEvent evt) { 
      final C c = (C) evt.getSource(); 
      String s = c.getText(); 

      if (evt.isTemporary()) { 
       return; 
      } 
      for (int i = 0; i < s.length(); i++) { 
       if (!Character.isDigit(s.charAt(i))) { 
        // System.out.println("must only contain digits"); 
        c.requestFocus(); 
        c.selectAll(); 
        break; 
       } 
      } 

     } 
    } 

お知らせを試してみてください:あなたのリスナーが複数回使用するcappableです。

0

コードにジェネリックが必要とは思われません。 MyFocusListenerは既にJTextComponentsの両方で動作しますが、JTextFieldsだけでなく、JTextComponentで宣言されたメソッドを使用するため、他のクラスでは機能しません。すでに他のアプリケーションで使用することができます。

あなたはまだリスナー使用のジェネリック(宿題?)を作りたい場合は、これを使用する:

class MyFocusListener<T extends JTextComponent> extends FocusAdapter { 

    public void focusGained(FocusEvent evt) { 
     final T c = (T)evt.getSource(); 
     String s = c.getText(); 
     c.requestFocus(); 
     c.selectAll(); 

     for (int i = 0; i < s.length(); i++) { 
      if (!Character.isDigit(s.charAt(i))) { 
       c.setSelectionStart(i); 
       c.setSelectionEnd(i); 
       break; 
      } 
     } 
    } 

    public void focusLost(FocusEvent evt) { 
     final T c = (T) evt.getSource(); 
     String s = c.getText(); 

     if (evt.isTemporary()) { 
      return; 
     } 
     for (int i = 0; i < s.length(); i++) { 
      if (!Character.isDigit(s.charAt(i))) { 
      c.requestFocus(); 
       c.selectAll(); 
       break; 
      } 
     } 
    } 

} 
関連する問題