Проблема возникает, когда происходит потеря фокуса на компоненте, 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");
}
}
