1

我有一个包含两个组件的简单 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);
        }
    }
}
4

1 回答 1

4

它还需要验证(和存储)

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

编辑:

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

而不是使用 JTextField 使用 JFormattedTextField 它将数据恢复为以前的值。您不需要使用 InputVerifier。阅读 Swing 教程中有关如何使用格式化文本字段的部分以获取更多信息和示例。

于 2013-10-29T01:07:04.600 回答