有一個文本字段,當失去焦點時它會驗證輸入,如果沒有通過,打印出錯誤信息(這裏很簡單,只是有一個空的檢查)。並且在文本框旁邊有一個按鈕,一旦點擊它就會打印出文本。如何在UI上進行數據驗證時「忽略/丟棄」Swing UI事件?
正如我試過,當輸入一些文本,然後單擊按鈕,它將觸發文本字段的焦點丟失事件和按鈕事件。換句話說,它將首先進行驗證,然後打印輸入文本。
下面是我的問題如果驗證未通過,防止打印文本的好方法是什麼?或者如果驗證沒有通過,是否有辦法「忽略」按鈕上的點擊事件?
我試圖用一個布爾標誌來表示驗證結果,並檢查標誌時執行按鈕的動作,但我不認爲這是一個好方法。據我所知,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();
}
}
考慮使用InputVerifier(而不是低級別的focusListener) - [驗證示例](http:// stackoverflow。com/a/14041811/203657) – kleopatra 2013-03-28 11:26:22
@kleopatra我試着用InputVerifier,但似乎按鈕不能在顯示錯誤信息後彈起來,你能檢查我的最新代碼並給出建議嗎? – Aaron 2013-03-28 14:37:18
之前沒有看到您的非答案(另一個原因,您不應在答案部分發布澄清/後續問題:-)。修復你的InputVerifier的實現,並檢查按鈕是否仍然卡住(早期的jdks中有一個bug,所以它可能) – kleopatra 2013-03-28 14:50:54