【问题标题】:How to send focus lost event before mouse pressed event?如何在鼠标按下事件之前发送焦点丢失事件?
【发布时间】:2013-11-07 21:13:39
【问题描述】:

我有一个包含两个组件的简单 GUI:JTextField 和一个自定义组件 (MyComponent)。 最初,文本字段具有焦点,单击自定义组件会使其具有焦点。

目前我正在使用requestFocusInWindow 手动设置焦点,但focusLost 事件发生在mousePressed 事件完成之后。有没有办法让focusLost 事件在mousePressed 事件结束之前发生?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Example  {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Example");
        frame.setLayout(new FlowLayout());
        JTextField textField = new JTextField(10);
        textField.addFocusListener(new FocusAdapter() {
            public void focusLost(FocusEvent event) {
                System.out.println("focusLost");
            }
        });
        frame.add(textField);
        frame.add(new MyComponent());
        frame.pack();
        frame.setVisible(true);
    }

    private static class MyComponent extends JComponent {
        public MyComponent() {
            setFocusable(true);
            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent event) {
                    requestFocusInWindow();
                    System.out.println("mousePressed");
                }
            });
        }

        public Dimension getPreferredSize() {
            return new Dimension(400, 300);
        }
    }
}

【问题讨论】:

  • 因为事件是排队的(所有事件都在同一个线程上调用),这是 AWT/Swing 的本质。在当前方法返回之前,不会发生进一步的事件。
  • 对,但是有什么办法可以在mousePressed事件之前改变焦点?
  • @DanielGibbs,你为什么需要这样的选项?你能解释一下你的用例吗,比如你想在失去焦点之前验证你的文本字段数据吗?
  • 是的,但不是每次按键。它还需要在mousePressed 事件结束之前进行验证(并存储),因为mousePressed 事件会使用存储在内存中的值重置文本字段。

标签: java swing focus mouseevent jtextfield


【解决方案1】:

还需要验证(和存储)

您可以在 JTextField 上使用 InputVerifier。它将在焦点转移之前验证文本字段中的文本。如果数据无效,焦点将停留在文本字段上。

编辑:

如果在失去焦点时数据无效,我可以删除此行为并将文本字段恢复为以前的值吗?

而不是使用 JTextField 使用 JFormattedTextField 它将数据恢复为以前的值。您不需要使用 InputVerifier。阅读 How to Use Formatted Text Fields 上的 Swing 教程部分,了解更多信息和示例。

【讨论】:

  • "如果数据无效,焦点将停留在文本字段上。"如果失去焦点时数据无效,我可以删除此行为并将文本字段恢复为以前的值吗?
  • 谢谢,InputVerifierJFormattedTextField 都可以做我想做的事。
  • 这值得 +1 只是为了破译问题
猜你喜欢
  • 2013-11-19
  • 2018-03-15
  • 1970-01-01
  • 2016-03-03
  • 2012-11-28
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多