JComboBox添加FocusListener

JComboBox添加FocusListener

系统:Win10
JDK:1.8.0_121
IDEA:2017.3.2

1.需求描述

新建一个登录窗口,用户输入选用可编辑的JComboBox组件,可下拉可编辑。
用户输入框默认有提示语句:请输入用户。在进行编辑时,该提示隐藏,编辑结束如果用户值为空,将提示显示出来

2.问题分析

这里有个问题点大家可能会忽略,JComboBox在直接设置FocusListener时可能不会生效,就是无法监听到用户框是否正在输入。
解决办法:
将监听放在getEditor().getEditorComponent()组件上来解决
getEditor():返回用于绘制和编辑 JComboBox 字段中所选项的编辑器
getEditorComponent():返回应该添加到此编辑器的树层次结构中的组件

3.代码示例

public class JComboBoxDemo {
    
    
    public static void main(String[] args) {
    
    
        // 创建一个JFrame对象
        JFrame frame = new JFrame("JComboBox添加FocusListener");
        // 创建面板
        JPanel loginPanel = new JPanel();
        loginPanel.setLayout(null);
        // 用户标签
        JLabel nameLabel = new JLabel("用户:");
        nameLabel.setBounds(100,60,60,20);
        // 用户输入
        JComboBox<String> nameField = new JComboBox<>();
        String[] names = {
    
    "admin", "1001", "1002"};
        nameField.setModel(new DefaultComboBoxModel<>(names));
        nameField.setBounds(160,58,140,30);
        JLabel mask1 = setPlaceholder(nameField, "请输入用户");
        nameField.setEditable(true); // 设置JComboBox可编辑
        nameField.setSelectedIndex(-1); // 设置JComboBox默认为空
        // 密码标签
        JLabel passwordLabel = new JLabel("密码:");
        passwordLabel.setBounds(100,110,60,20);
        // 密码输入
        JPasswordField passwordField = new JPasswordField();
        passwordField.setBounds(160,108,140,30);
        JLabel mask2 = setPlaceholder(passwordField, "请输入密码");

        // 默认是面板获取焦点
        loginPanel.setFocusable(true);

        // 添加各个组件
        loginPanel.add(mask1);
        loginPanel.add(mask2);
        loginPanel.add(nameLabel);
        loginPanel.add(nameField);
        loginPanel.add(passwordLabel);
        loginPanel.add(passwordField);
        frame.add(loginPanel);

        // 用户输入框添加监听
        nameField.getEditor().getEditorComponent().addFocusListener(new FocusListener() {
    
    
            // 输入时,将提示语句设置为不显示
            // @Override
            public void focusGained(FocusEvent e) {
    
    
                mask1.setVisible(false);
            }

            @Override
            public void focusLost(FocusEvent e) {
    
    
                JTextField textField = (JTextField)e.getComponent();
                String text = textField.getText();
                if (text == null || text.length() ==0) {
    
    
                    mask1.setVisible(true);
                }
            }
        });

        // 密码输入框添加监听
        passwordField.addFocusListener(new FocusListener() {
    
    
            // 输入时,将提示语句设置为不显示
            @Override
            public void focusGained(FocusEvent e) {
    
    
                mask2.setVisible(false);
            }

            // 输入结束,如果密码框为空,将提示设置为显示
            @Override
            public void focusLost(FocusEvent e) {
    
    
                // String text = new String(passwordField.getPassword());
                char[] password = passwordField.getPassword();
                if (password == null || password.length == 0) {
    
    
                    mask2.setVisible(true);
                }
            }
        });


        // 设置窗口大小
        frame.setSize(new Dimension(400,300));
        // 设置窗口居中显示
        frame.setLocationRelativeTo(null);
        // 设置窗口关闭后结束运行
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 设置窗口可见
        frame.setVisible(true);
    }

    // 设置输入提示
    private static JLabel setPlaceholder(JComponent c, String text) {
    
    
        JLabel mask = new JLabel();
        Rectangle r = c.getBounds();
        mask.setText(text);
        mask.setForeground(Color.lightGray);
        mask.setBounds(r.x+3,r.y,r.width - 2,r.height - 2);
        mask.setFont(new Font("宋体", 0 ,12));
        return mask;
    }
}

4.结果演示

静态图片:
在这里插入图片描述
动态演示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35132089/article/details/111772751