【发布时间】: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