“眨眼睛查看密碼”工具類實現思路:
一、核心功能
實現點擊眼睛圖標切換密碼明文/星號顯示,提升表單輸入體驗。包含以下關鍵功能:
? 初始狀態:密碼框顯示為星號,閉眼圖標可見。
? 點擊閉眼圖標:切換為明文顯示,睜眼圖標可見。
? 點擊睜眼圖標:恢復星號顯示,閉眼圖標可見。
二、組件準備
- 兩個輸入框
?PasswordField
:默認顯示星號的密碼輸入框。
?TextField
:顯示明文的文本框(初始隱藏)。 - 兩個圖標控件
?ImageView openEye
:睜眼圖標(初始隱藏)。
?ImageView closeEye
:閉眼圖標(初始顯示)。
三、實現步驟
1. 初始化狀態
? 隱藏明文框:visiblePasswordField.setVisible(false)
? 顯示密碼框:passwordField.setVisible(true)
? 圖標狀態:顯示閉眼圖標,隱藏睜眼圖標。
2. 事件綁定
? 監聽兩個圖標的點擊事件:無論點擊哪個圖標,觸發切換邏輯。
openEye.setOnMouseClicked(e -> handleOpenEye());
closeEye.setOnMouseClicked(e -> handleOpenEye());
3. 切換邏輯實現
? 判斷當前顯示狀態:根據明文框是否可見決定下一步動作。
boolean isPasswordVisible = visiblePasswordField.isVisible();
? 切換到明文顯示:
? 將密碼框內容復制到明文框:visiblePasswordField.setText(passwordField.getText())
? 顯示明文框,隱藏密碼框。
? 切換圖標狀態:顯示睜眼,隱藏閉眼。
? 切換到星號顯示:
? 將明文內容復制回密碼框:passwordField.setText(visiblePasswordField.getText())
? 顯示密碼框,隱藏明文框。
? 切換圖標狀態:顯示閉眼,隱藏睜眼。
四、關鍵問題處理
? 文本同步:切換時同步內容,避免切換后數據不一致。
? 焦點管理:切換時保持輸入焦點,避免用戶需要重新點擊輸入框。
? 空值處理:確保null
或空字符串時不會拋出異常。
五、優化建議
? 雙向綁定(可選):
使用JavaFX屬性綁定,實現兩個輸入框內容實時同步,避免手動復制。
visiblePasswordField.textProperty().bindBidirectional(passwordField.textProperty());
? 圖標樣式:
添加CSS懸浮效果(如手指光標),提升用戶體驗。
? 輸入監聽:
限制明文框的輸入類型(如僅允許特定字符)。
六、使用示例
// 在FXML控制器中初始化工具類
ExchangeEyeTUtil eyeUtil = new ExchangeEyeTUtil(visiblePwdField, passwordField, openEyeIcon, closeEyeIcon
);
總結:該工具類通過狀態切換和事件監聽,實現密碼可見性控制,核心在于正確處理組件顯示/隱藏狀態及內容同步。開發者可結合具體需求進行擴展優化。
package com.example.demo6.util;import javafx.fxml.FXML;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;public class ExchangeEyeTUtil {private final TextField visiblePasswordField;private final PasswordField passwordField;private final ImageView openEye;private final ImageView closeEye;public ExchangeEyeTUtil(TextField visiblePasswordField, PasswordField passwordField, ImageView openEye, ImageView closeEye) {this.visiblePasswordField = visiblePasswordField;this.passwordField = passwordField;this.openEye = openEye;this.closeEye = closeEye;// 初始狀態設置initialize();}@FXMLprivate void initialize() {// 初始化時隱藏明文輸入框和睜眼圖標visiblePasswordField.setVisible(false);openEye.setVisible(false);closeEye.setVisible(true);}@FXMLpublic void handleOpenEye() {// 判斷當前是否顯示明文boolean isPasswordVisible = visiblePasswordField.isVisible();if (isPasswordVisible) {// 切換到密碼隱藏狀態passwordField.setText(visiblePasswordField.getText());passwordField.setVisible(true);visiblePasswordField.setVisible(false);openEye.setVisible(false);closeEye.setVisible(true);} else {// 切換到明文顯示狀態visiblePasswordField.setText(passwordField.getText());visiblePasswordField.setVisible(true);passwordField.setVisible(false);openEye.setVisible(true);closeEye.setVisible(false);}}
}