Как проверить событие на значение lostfocus

Проблема возникает, когда происходит потеря фокуса  на компоненте, gainedFocus который отправлен на следующий компонент в SystemEventQueue. Мы должны захватить это событие, и перенаправить внимания к предыдущему компоненту (если есть ошибки валидации). Мы не можем использовать инструментарий. getDefaultToolkit().getSystemEventQueue() напрямую, чтобы удалить событие gainedFocus из-за ограничений безопасности в Апплета. Это можно сделать с метод invokeLater класса метода swingutilities.

 import java.awt.*; 
 import java.awt.event.*;
 import javax.swing.*;
 
 public class tswing extends JApplet {
 
   JTextField textfield1, textfield2;
   JLabel label1;
 
   public void init() {
 
     getContentPane().setLayout(new FlowLayout());
 
     //
     label1 = new JLabel("must be 'a' or 'b' ");
     textfield1 = new JTextField(5);
     getContentPane().add(label1);
     getContentPane().add(textfield1);
     textfield2 = new JTextField(5);
     getContentPane().add(textfield2);
 
     textfield1.addFocusListener(new FocusListener() {
        public void focusGained(FocusEvent e) {}; // не нужен
 
        public void focusLost(FocusEvent e) {
 
          if (!e.isTemporary() && isEnabled() ) {
            String fieldContent = textfield1.getText();
            if (!fieldContent.equals("a") && !fieldContent.equals("b")) {
              Toolkit.getDefaultToolkit().beep();
              System.out.println("illegal value! " + fieldContent );
              SwingUtilities.invokeLater(new FocusGrabber(textfield1));         
              }
          }}
        });
     }
 }
 
 
import javax.swing.*;
 
public class FocusGrabber implements Runnable {
  
  private JComponent component;
  
  public FocusGrabber(JComponent component) {
   this.component = component;
  }
   
  public void run() {
   component.grabFocus();
  }
}

JDK1.3 обеспечивает новый класс, InputVerfier, которые могут быть использованы для этой реализации.

 import java.awt.*;
 import java.util.*;
 import java.awt.event.*;
 import javax.swing.*;
 
 // первый ли он ожидает строку "документ" в качестве входных данных, 
 // и позволит сосредоточиться, менять только если необходимые строки
 // введены...
 
 class VerifierTest extends JFrame {
  public VerifierTest () {
    JTextField tf,tf2;
    tf = new JTextField ("howto is required");
 
    getContentPane().add (tf, BorderLayout.NORTH);
    tf.setInputVerifier(new HowtoVerifier());
 
    tf2 = new JTextField ("howto come here");
    getContentPane().add (tf2, BorderLayout.SOUTH);
 
    addWindowListener(new WindowCloser());
  }
  
 
 public static void main (String [] args) {
   Frame f = new VerifierTest ();
   f.pack();
   f.show();
 }
}
 
class WindowCloser extends WindowAdapter {
 public void windowClosing(WindowEvent e) {
   Window win = e.getWindow();
   win.setVisible(false);
   System.exit(0);
 }
}
 
 
class HowtoVerifier extends InputVerifier {
  public boolean verify(JComponent input) {
    JTextField tf = (JTextField) input;
    String pass = tf.getText();
    return pass.equals("howto");
  }
}
Обновлено: 07.04.2017 — 16:18

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.