Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在鼠标按下事件之前发送焦点丢失事件?_Java_Swing_Focus_Mouseevent_Jtextfield - Fatal编程技术网

Java 如何在鼠标按下事件之前发送焦点丢失事件?

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

我有一个简单的GUI,它有两个组件:一个是
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