Java 如何在鼠标按下事件之前发送焦点丢失事件?
我有一个简单的GUI,它有两个组件:一个是Java 如何在鼠标按下事件之前发送焦点丢失事件?,java,swing,focus,mouseevent,jtextfield,Java,Swing,Focus,Mouseevent,Jtextfield,我有一个简单的GUI,它有两个组件:一个是JTextField,另一个是自定义组件(MyComponent)。 最初,文本字段具有焦点,单击自定义组件会使其具有焦点 目前我正在使用requestFocusInWindow手动设置焦点,但是focusLost事件发生在mousePressed事件完成后。有没有办法让焦点丢失事件在鼠标按下事件完成之前发生 import java.awt.*; import java.awt.event.*; import javax.swing.*; import
JTextField
,另一个是自定义组件(MyComponent
)。
最初,文本字段具有焦点,单击自定义组件会使其具有焦点
目前我正在使用requestFocusInWindow
手动设置焦点,但是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);
}
}
}
它还需要验证(和存储)
您可以在jtext字段上使用
输入验证程序。它将在转移焦点之前验证文本字段中的文本。如果数据无效,焦点将停留在文本字段上
编辑:
如果失去焦点时数据无效,我是否可以删除此行为并将文本字段恢复为以前的值
与其使用JTextField,不如使用JFormattedTextField,它会将数据还原为以前的值。您不需要使用InputVerifier。有关更多信息和示例,请阅读上Swing教程的部分
它还需要验证(和存储)
您可以在jtext字段上使用输入验证程序。它将在转移焦点之前验证文本字段中的文本。如果数据无效,焦点将停留在文本字段上
编辑:
如果失去焦点时数据无效,我是否可以删除此行为并将文本字段恢复为以前的值
与其使用JTextField,不如使用JFormattedTextField,它会将数据还原为以前的值。您不需要使用InputVerifier。有关更多信息和示例,请阅读上的Swing教程部分。因为事件是排队的(所有事件在同一线程上调用),这是AWT/Swing的本质。在当前方法返回之前,不会发生进一步的事件。对,但是有没有办法在按下mousePressed
事件之前改变焦点?@DanielGibbs,为什么需要这样的选项?你能解释一下你的用例吗,比如你想在文本字段数据失去焦点之前验证它吗?是的,但不是每按一次键。它还需要在mousePressed
事件结束之前进行验证(并存储),因为mousePressed
事件使用存储在内存中的值重置文本字段。因为事件排队(在同一线程上调用所有事件),这属于AWT/Swing的性质。在当前方法返回之前,不会发生进一步的事件。对,但是有没有办法在按下mousePressed
事件之前改变焦点?@DanielGibbs,为什么需要这样的选项?你能解释一下你的用例吗,比如你想在文本字段数据失去焦点之前验证它吗?是的,但不是每按一次键。它还需要在mousePressed
事件结束之前进行验证(并存储),因为mousePressed
事件会使用存储在内存中的值重置文本字段。“如果数据无效,焦点将停留在文本字段上。”如果失去焦点时数据无效,我是否可以删除此行为并将文本字段恢复为以前的值?谢谢,InputVerifier
和JFormattedTextField
都可以做我想做的事情。这值得一个+1来解释“如果数据无效,焦点将保留在文本字段上”的问题如果失去焦点时数据无效,我是否可以删除此行为,并将文本字段还原为以前的值?谢谢,InputVerifier
和JFormattedTextField
都可以执行我想要的操作。仅为了解译问题,这应该得到+1