我正在使用包含JTextField
的 java swing表单。文本字段需要输入验证,当字段损失集中时执行验证。即点击场外的任何软件。
表单还包含JButton
以清除(取消)表单。现在每当我按下取消按钮并且Textfield
是当前聚焦的组件时,就会调用验证功能。这不应该发生。
我尝试了InputVerifier
和Focuslistener
有没有办法让我知道哪个组件导致焦点发生变化?
答案 0 :(得分:3)
您可以使用FocusListener
对focusLost
事件做出反应。在那里,您可以从getOppositeComponent()
通过FocusEvent
检索焦点的目的地。如果目的地是clear / cancel / whatever按钮什么也不做,否则验证。
这是一个非常基本的例子:
JTextField textField = new JTextField(15);
textField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
Component comp = e.getOppositeComponent();
if (comp instanceof JButton) {
JButton button = (JButton) comp;
String buttonText = button.getText();
if (buttonText.equals("Cancel")) {
return;
}
}
// do the validation
System.out.println("validate");
}
});
实际上,camickr的solution比我上面的要简单得多。我不知道有没有内置的解决方案。
答案 1 :(得分:3)
这很好,但表单包含一个JButton来清除(取消)表单
您可以使用:
private async void PullTablePagesAsync()
{
var taskList = new List<Task>();
var faultedList = new List<Task>();
foreach (var featureItem in featuresWithDataName)
{
var task = Task.Run(() => PullTablePage();
taskList.Add(task);
if(taskList.Count == Constants.THREADS)
{
var anyFinished = await Task.WhenAny(taskList.ToArray());
await anyFinished;
for (var index = taskList.Count - 1; index >= 0; index--)
{
if (taskList[index].IsCompleted)
{
taskList.Remove(taskList[index]);
}
}
}
}
if (taskList.Any())
{
await Task.WhenAll(taskList);
}
//todo: what to do with faulted list?
}
以防止在您单击按钮时调用clearButton.setVerifyInputWhenFocusTarget(false);
。