Создать универсальный класс для Java-программы - PullRequest
0 голосов
/ 20 декабря 2011

Я написал класс на Java для JTextField Focus Listener, и я не знаю, как написать этот класс как универсальный класс. После того, как я написал обобщенный класс, он должен использоваться всеми JTextFields. Как я могу это сделать, пожалуйста, скажите мне путь через кодирование. Как написать универсальный класс для этого кода:

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

}
}

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Попробуйте это

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

        }
    }

Примечание: ваш слушатель может использовать несколько раз.

0 голосов
/ 20 декабря 2011

Я не думаю, что ваш код нуждается в каких-либо обобщениях; 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;
            }
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...