JComboBox 实现 placeholder 功能

系统:Win10
JDK:1.8.0_333
IDEA:2020.3.4

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.结果演示

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李晋江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值