Проблема возникает, когда происходит потеря фокуса на компоненте, gainedFocus который отправлен на следующий компонент в SystemEventQueue. Мы должны захватить это событие, и перенаправить внимания к предыдущему компоненту (если есть ошибки валидации). Мы не можем использовать инструментарий. getDefaultToolkit().getSystemEventQueue() напрямую, чтобы удалить событие gainedFocus из-за ограничений безопасности в Апплета. Это можно сделать с метод invokeLater класса метода swingutilities.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
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, которые могут быть использованы для этой реализации.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
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"); } } |