焦点变化前的Java Swing调用方法

时间:2015-09-16 16:13:41

标签: java swing

我正在使用包含JTextField java swing表单。文本字段需要输入验证,当字段损失集中时执行验证。即点击场外的任何软件。

表单还包含JButton以清除(取消)表单。现在每当我按下取消按钮并且Textfield是当前聚焦的组件时,就会调用验证功能。这不应该发生。

我尝试了InputVerifierFocuslistener

有没有办法让我知道哪个组件导致焦点发生变化?

2 个答案:

答案 0 :(得分:3)

您可以使用FocusListenerfocusLost事件做出反应。在那里,您可以从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);