2011-12-20 53 views
0

我已经为JTextField Focus Listener编写了一个Java类,我不知道如何将此类编写为泛型类。一旦我写了泛型类,它应该被所有的JTextFields使用,我该如何做到这一点,请告诉我通过编码的方式。如何写一个通用类,使用这个下面的代码:为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 2011-12-20 08:47:48

+0

工作正常,将focuslistener作为泛型类写入,以及如何在其他具有JTextField的程序中使用泛型类。 – Ayesha 2011-12-20 08:53:04

+0

+1,那里不需要泛型。投之前的一个例子将是一件好事。 – 2011-12-20 09:05:04

回答

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; 
      } 
     } 
    } 

}