テキストフィールドがあり、フォーカスが失われると入力が検証され、渡されなかった場合はエラーメッセージが出力されます(ここでは単純に空のチェックがあります)。テキストフィールドの横にボタンがあり、クリックするとテキストが印刷されます。
私が試したように、テキストを入力してボタンをクリックすると、テキストフィールドのフォーカスロストイベントとボタンのイベントの両方がトリガーされます。つまり、最初に検証を行い、次に入力テキストを出力します。
ここで私の質問があります。検証に合格しなかった場合にテキストを印刷しないようにする良い方法は何ですか? または、検証に合格しなかった場合にボタンのクリックイベントを「無視」する方法はありますか?
検証結果を示すブール値フラグを使用して、ボタンのアクションを実行するときにフラグをチェックしようとしましたが、それは良いアプローチではないと思います。イベントを処理するイベント ディスパッチャー スレッドが Swing にあることは知っていますが、ここからイベントをキャンセルすることはできますか?
以下は、質問を説明するコードです。
public class SimpleDemo
{
public static void main(String[] args)
{
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel content = new JPanel(new FlowLayout());
frame.setContentPane(content);
final JTextField textField = new JTextField(10);
textField.addFocusListener(new FocusAdapter()
{
@Override
public void focusLost(FocusEvent e)
{
String text = textField.getText();
// do some validation here, if not validated
// do not trigger the event on button.
if ("".equals(text))
{
System.out.print("please input a text!");
}
}
});
content.add(textField);
JButton button = new JButton("Print Text");
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
// action performed for button
String text = textField.getText();
System.out.println(text);
}
});
content.add(button);
frame.setVisible(true);
frame.pack();
}
}