系统:Win10
JDK:1.8.0_121
IDEA:2017.3.2
新建一个登录窗口,用户输入选用可编辑的JComboBox组件,可下拉可编辑。
用户输入框默认有提示语句:请输入用户。在进行编辑时,该提示隐藏,编辑结束如果用户值为空,将提示显示出来
这里有个问题点大家可能会忽略,JComboBox在直接设置FocusListener时可能不会生效,就是无法监听到用户框是否正在输入。
解决办法:
将监听放在getEditor().getEditorComponent()组件上来解决
getEditor():返回用于绘制和编辑 JComboBox 字段中所选项的编辑器
getEditorComponent():返回应该添加到此编辑器的树层次结构中的组件
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;
}
}