package denglu;
|
|
import homein.WenJianSuo;
|
import ui.UIConfig;
|
import javax.swing.*;
|
import java.awt.*;
|
import java.awt.event.*;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
public class Denglu extends JFrame {
|
private JComboBox<String> languageSelect;
|
private JTextField usernameField;
|
private JPasswordField passwordField;
|
private JCheckBox rememberMe;
|
private JButton loginButton;
|
private JButton registerButton;
|
private Map<String, Map<String, String>> translations;
|
private JPanel mainPanel;
|
private JLabel usernameLabel, passwordLabel;
|
private JLabel forgotPassword, noAccountLabel, signupLink, appInfoLabel;
|
|
// 主题颜色
|
private final Color THEME_COLOR = new Color(46, 139, 87);
|
private final Color THEME_HOVER_COLOR = new Color(30, 107, 69);
|
|
// 当前语言代码
|
private String currentLanguageCode = "zh";
|
|
public Denglu() {
|
initializeTranslations();
|
initializeUI();
|
setupEventHandlers();
|
loadUserPreferences();
|
}
|
|
private void initializeTranslations() {
|
translations = new HashMap<>();
|
|
// 中文翻译
|
Map<String, String> zh = new HashMap<>();
|
zh.put("username_label", "用户名或邮箱");
|
zh.put("password_label", "密码");
|
zh.put("remember_me", "记住我");
|
zh.put("forgot_password", "忘记密码?");
|
zh.put("login_button", "登录");
|
zh.put("no_account", "还没有账户?");
|
zh.put("sign_up", "立即注册");
|
zh.put("app_title", "智能割草系统");
|
zh.put("window_title", "智能割草系统 - 登录");
|
zh.put("app_info", "智能割草系统 © 2023 - 智能割草解决方案");
|
zh.put("register_button", "注册新账户");
|
translations.put("zh", zh);
|
|
// 英文翻译
|
Map<String, String> en = new HashMap<>();
|
en.put("username_label", "Username or Email");
|
en.put("password_label", "Password");
|
en.put("remember_me", "Remember me");
|
en.put("forgot_password", "Forgot password?");
|
en.put("login_button", "Sign In");
|
en.put("no_account", "Don't have an account?");
|
en.put("sign_up", "Sign Up");
|
en.put("app_title", "Smart Mowing System");
|
en.put("window_title", "Smart Mowing System - Login");
|
en.put("app_info", "Smart Mowing System © 2023 - Intelligent Lawn Care");
|
en.put("register_button", "Create New Account");
|
translations.put("en", en);
|
|
// 西班牙语翻译
|
Map<String, String> es = new HashMap<>();
|
es.put("username_label", "Usuario o Correo Electrónico");
|
es.put("password_label", "Contraseña");
|
es.put("remember_me", "Recuérdame");
|
es.put("forgot_password", "¿Olvidaste tu contraseña?");
|
es.put("login_button", "Iniciar Sesión");
|
es.put("no_account", "¿No tienes una cuenta?");
|
es.put("sign_up", "Regístrate");
|
es.put("app_title", "Sistema de Corte Inteligente");
|
es.put("window_title", "Sistema de Corte Inteligente - Iniciar Sesión");
|
es.put("app_info", "Sistema de Corte Inteligente © 2023 - Soluciones Inteligentes");
|
es.put("register_button", "Crear Nueva Cuenta");
|
translations.put("es", es);
|
|
// 法语翻译
|
Map<String, String> fr = new HashMap<>();
|
fr.put("username_label", "Nom d'utilisateur ou Email");
|
fr.put("password_label", "Mot de passe");
|
fr.put("remember_me", "Se souvenir de moi");
|
fr.put("forgot_password", "Mot de passe oublié?");
|
fr.put("login_button", "Se connecter");
|
fr.put("no_account", "Vous n'avez pas de compte?");
|
fr.put("sign_up", "S'inscrire");
|
fr.put("app_title", "Système de Tonte Intelligent");
|
fr.put("window_title", "Système de Tonte Intelligent - Connexion");
|
fr.put("app_info", "Système de Tonte Intelligent © 2023 - Solutions de Tonte");
|
fr.put("register_button", "Créer un Nouveau Compte");
|
translations.put("fr", fr);
|
|
// 德语翻译
|
Map<String, String> de = new HashMap<>();
|
de.put("username_label", "Benutzername oder E-Mail");
|
de.put("password_label", "Passwort");
|
de.put("remember_me", "Angemeldet bleiben");
|
de.put("forgot_password", "Passwort vergessen?");
|
de.put("login_button", "Anmelden");
|
de.put("no_account", "Sie haben noch kein Konto?");
|
de.put("sign_up", "Registrieren");
|
de.put("app_title", "Intelligentes Mähsystem");
|
de.put("window_title", "Intelligentes Mähsystem - Anmeldung");
|
de.put("app_info", "Intelligentes Mähsystem © 2023 - Mählösungen");
|
de.put("register_button", "Neues Konto Erstellen");
|
translations.put("de", de);
|
}
|
|
private void initializeUI() {
|
setTitle(getTranslationValue(currentLanguageCode, "window_title", "系统登录"));
|
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
// 设置紧凑布局尺寸
|
setSize(UIConfig.DIALOG_WIDTH, UIConfig.DIALOG_HEIGHT);
|
setMinimumSize(new Dimension(UIConfig.DIALOG_WIDTH, UIConfig.DIALOG_HEIGHT));
|
setResizable(false);
|
|
setupCompactLayout();
|
setLocationRelativeTo(null);
|
}
|
|
private void setupCompactLayout() {
|
mainPanel = new JPanel(new BorderLayout());
|
mainPanel.setBackground(Color.WHITE);
|
mainPanel.setBorder(BorderFactory.createEmptyBorder(15, 20, 15, 20));
|
|
// 顶部面板 - 只包含语言选择
|
JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
|
topPanel.setBackground(Color.WHITE);
|
|
// 语言选择
|
languageSelect = new JComboBox<>(new String[]{"中文", "English", "Español", "Français", "Deutsch"});
|
languageSelect.setPreferredSize(new Dimension(90, 28));
|
languageSelect.setFont(new Font("PingFang SC", Font.PLAIN, 11));
|
languageSelect.setBackground(Color.WHITE);
|
languageSelect.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(THEME_COLOR),
|
BorderFactory.createEmptyBorder(0, 5, 0, 5)
|
));
|
languageSelect.setForeground(THEME_COLOR);
|
topPanel.add(languageSelect);
|
|
// 主表单区域
|
JPanel formPanel = createFormPanel();
|
|
// 底部应用信息
|
JPanel appInfoPanel = createAppInfoPanel();
|
|
mainPanel.add(topPanel, BorderLayout.NORTH);
|
mainPanel.add(formPanel, BorderLayout.CENTER);
|
mainPanel.add(appInfoPanel, BorderLayout.SOUTH);
|
|
add(mainPanel);
|
}
|
|
private JPanel createFormPanel() {
|
JPanel formPanel = new JPanel();
|
formPanel.setLayout(new BoxLayout(formPanel, BoxLayout.Y_AXIS));
|
formPanel.setBackground(Color.WHITE);
|
formPanel.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(new Color(230, 230, 230)),
|
BorderFactory.createEmptyBorder(25, 20, 25, 20)
|
));
|
|
// 登录标题
|
// 用户名输入
|
usernameLabel = new JLabel("用户名或邮箱", SwingConstants.CENTER);
|
usernameLabel.setFont(new Font("PingFang SC", Font.BOLD, 13));
|
usernameLabel.setForeground(THEME_COLOR);
|
usernameLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
|
usernameField = new JTextField();
|
usernameField.setMaximumSize(new Dimension(Integer.MAX_VALUE, 38));
|
usernameField.setFont(new Font("PingFang SC", Font.PLAIN, 14));
|
usernameField.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(new Color(200, 200, 200)),
|
BorderFactory.createEmptyBorder(8, 10, 8, 10)
|
));
|
usernameField.setForeground(new Color(60, 60, 60));
|
|
// 密码输入
|
passwordLabel = new JLabel("密码", SwingConstants.CENTER);
|
passwordLabel.setFont(new Font("PingFang SC", Font.BOLD, 13));
|
passwordLabel.setForeground(THEME_COLOR);
|
passwordLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
|
passwordField = new JPasswordField();
|
passwordField.setMaximumSize(new Dimension(Integer.MAX_VALUE, 38));
|
passwordField.setFont(new Font("PingFang SC", Font.PLAIN, 14));
|
passwordField.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(new Color(200, 200, 200)),
|
BorderFactory.createEmptyBorder(8, 10, 8, 10)
|
));
|
passwordField.setForeground(new Color(60, 60, 60));
|
|
// 记住我和忘记密码
|
JPanel rememberForgotPanel = new JPanel(new BorderLayout());
|
rememberForgotPanel.setBackground(Color.WHITE);
|
rememberForgotPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 25));
|
|
rememberMe = new JCheckBox("记住我");
|
rememberMe.setFont(new Font("PingFang SC", Font.PLAIN, 12));
|
rememberMe.setBackground(Color.WHITE);
|
rememberMe.setForeground(new Color(80, 80, 80));
|
|
forgotPassword = new JLabel("忘记密码?");
|
forgotPassword.setFont(new Font("PingFang SC", Font.PLAIN, 12));
|
forgotPassword.setForeground(THEME_COLOR);
|
forgotPassword.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
|
rememberForgotPanel.add(rememberMe, BorderLayout.WEST);
|
rememberForgotPanel.add(forgotPassword, BorderLayout.EAST);
|
|
// 登录按钮 - 水平居中,长度与文本框宽度保持相近
|
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
|
buttonPanel.setBackground(Color.WHITE);
|
buttonPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 50));
|
|
loginButton = new JButton("登录");
|
loginButton.setBackground(THEME_COLOR);
|
loginButton.setForeground(Color.WHITE);
|
loginButton.setFont(new Font("PingFang SC", Font.BOLD, 15));
|
// 设置登录按钮长度接近文本框宽度
|
loginButton.setPreferredSize(new Dimension(300, 48));
|
loginButton.setBorderPainted(false);
|
loginButton.setFocusPainted(false);
|
loginButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
|
// 鼠标悬停效果
|
loginButton.addMouseListener(new MouseAdapter() {
|
public void mouseEntered(MouseEvent e) {
|
loginButton.setBackground(THEME_HOVER_COLOR);
|
}
|
public void mouseExited(MouseEvent e) {
|
loginButton.setBackground(THEME_COLOR);
|
}
|
});
|
|
buttonPanel.add(loginButton);
|
|
// 注册按钮 - 更明显的注册入口
|
JPanel registerButtonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
|
registerButtonPanel.setBackground(Color.WHITE);
|
registerButtonPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 45));
|
|
registerButton = new JButton("注册新账户");
|
registerButton.setBackground(Color.WHITE);
|
registerButton.setForeground(THEME_COLOR);
|
registerButton.setFont(new Font("PingFang SC", Font.BOLD, 14));
|
registerButton.setPreferredSize(new Dimension(180, 42));
|
registerButton.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(THEME_COLOR),
|
BorderFactory.createEmptyBorder(5, 15, 5, 15)
|
));
|
registerButton.setFocusPainted(false);
|
registerButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
|
// 注册按钮悬停效果
|
registerButton.addMouseListener(new MouseAdapter() {
|
public void mouseEntered(MouseEvent e) {
|
registerButton.setBackground(new Color(240, 250, 240));
|
}
|
public void mouseExited(MouseEvent e) {
|
registerButton.setBackground(Color.WHITE);
|
}
|
});
|
|
registerButtonPanel.add(registerButton);
|
|
// 注册链接(保留原有的文本链接)
|
JPanel signupPanel = new JPanel();
|
signupPanel.setBackground(Color.WHITE);
|
noAccountLabel = new JLabel("还没有账户? ");
|
noAccountLabel.setFont(new Font("PingFang SC", Font.PLAIN, 12));
|
noAccountLabel.setForeground(new Color(120, 120, 120));
|
signupLink = new JLabel("立即注册");
|
signupLink.setFont(new Font("PingFang SC", Font.BOLD, 12));
|
signupLink.setForeground(THEME_COLOR);
|
signupLink.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
signupPanel.add(noAccountLabel);
|
signupPanel.add(signupLink);
|
|
// 组装表单
|
formPanel.add(Box.createRigidArea(new Dimension(0, 15)));
|
formPanel.add(usernameLabel);
|
formPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
formPanel.add(usernameField);
|
formPanel.add(Box.createRigidArea(new Dimension(0, 30)));
|
formPanel.add(passwordLabel);
|
formPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
formPanel.add(passwordField);
|
formPanel.add(Box.createRigidArea(new Dimension(0, 12)));
|
formPanel.add(rememberForgotPanel);
|
formPanel.add(Box.createRigidArea(new Dimension(0, 20)));
|
formPanel.add(buttonPanel); // 登录按钮
|
formPanel.add(Box.createRigidArea(new Dimension(0, 15)));
|
formPanel.add(registerButtonPanel); // 注册按钮
|
formPanel.add(Box.createRigidArea(new Dimension(0, 15)));
|
formPanel.add(signupPanel); // 保留原有的注册链接
|
|
return formPanel;
|
}
|
|
private JPanel createAppInfoPanel() {
|
JPanel appInfoPanel = new JPanel();
|
appInfoPanel.setBackground(Color.WHITE);
|
appInfoPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 5, 0));
|
appInfoLabel = new JLabel(
|
getTranslationValue(currentLanguageCode, "app_info", "智能割草系统 © 2023")
|
);
|
appInfoLabel.setFont(new Font("PingFang SC", Font.PLAIN, 10));
|
appInfoLabel.setForeground(new Color(150, 150, 150));
|
appInfoPanel.add(appInfoLabel);
|
|
return appInfoPanel;
|
}
|
|
private void setupEventHandlers() {
|
// 语言选择事件
|
languageSelect.addActionListener(e -> {
|
String selectedLanguage = (String) languageSelect.getSelectedItem();
|
updateLanguage(selectedLanguage);
|
});
|
|
// 登录按钮事件
|
loginButton.addActionListener(e -> performLogin());
|
|
// 回车键登录
|
passwordField.addActionListener(e -> performLogin());
|
|
// 忘记密码点击事件
|
forgotPassword.addMouseListener(new MouseAdapter() {
|
public void mouseClicked(MouseEvent e) {
|
JOptionPane.showMessageDialog(Denglu.this,
|
"请联系管理员重置密码",
|
"忘记密码",
|
JOptionPane.INFORMATION_MESSAGE);
|
}
|
});
|
|
// 注册链接点击事件 - 打开注册窗口
|
signupLink.addMouseListener(new MouseAdapter() {
|
public void mouseClicked(MouseEvent e) {
|
openRegistrationWindow();
|
}
|
});
|
|
// 注册按钮点击事件 - 打开注册窗口
|
registerButton.addActionListener(e -> openRegistrationWindow());
|
}
|
|
private void updateLanguage(String language) {
|
String langCode = getLanguageCode(language);
|
currentLanguageCode = langCode;
|
Map<String, String> translation = translations.get(langCode);
|
|
if (translation != null) {
|
// 更新所有界面文本
|
usernameLabel.setText(getTranslationValue(langCode, "username_label", usernameLabel.getText()));
|
passwordLabel.setText(getTranslationValue(langCode, "password_label", passwordLabel.getText()));
|
rememberMe.setText(getTranslationValue(langCode, "remember_me", rememberMe.getText()));
|
forgotPassword.setText(getTranslationValue(langCode, "forgot_password", forgotPassword.getText()));
|
loginButton.setText(getTranslationValue(langCode, "login_button", loginButton.getText()));
|
noAccountLabel.setText(getTranslationValue(langCode, "no_account", noAccountLabel.getText()));
|
signupLink.setText(getTranslationValue(langCode, "sign_up", signupLink.getText()));
|
appInfoLabel.setText(getTranslationValue(langCode, "app_info", appInfoLabel.getText()));
|
|
// 更新注册按钮文本
|
registerButton.setText(getTranslationValue(langCode, "register_button", registerButton.getText()));
|
|
// 更新窗口标题
|
setTitle(getTranslationValue(langCode, "window_title", getTitle()));
|
|
// 更新语言设置到文件
|
updateLanguagePreference(langCode);
|
}
|
}
|
|
private String getLanguageCode(String language) {
|
switch (language) {
|
case "中文": return "zh";
|
case "English": return "en";
|
case "Español": return "es";
|
case "Français": return "fr";
|
case "Deutsch": return "de";
|
default: return "zh";
|
}
|
}
|
|
private String getTranslationValue(String languageCode, String key, String defaultValue) {
|
Map<String, String> translation = translations.get(languageCode);
|
if (translation != null) {
|
String value = translation.get(key);
|
if (value != null && !value.trim().isEmpty()) {
|
return value;
|
}
|
}
|
return defaultValue;
|
}
|
|
private void updateLanguagePreference(String languageCode) {
|
String currentLanguage = UserChuShiHua.getProperty("language");
|
if (!languageCode.equals(currentLanguage)) {
|
UserChuShiHua.updateProperty("language", languageCode);
|
}
|
}
|
|
private void loadUserPreferences() {
|
// 加载用户语言偏好
|
String savedLanguage = UserChuShiHua.getProperty("language");
|
if (savedLanguage != null && !savedLanguage.equals("-1")) {
|
String languageName = getLanguageName(savedLanguage);
|
languageSelect.setSelectedItem(languageName);
|
updateLanguage(languageName);
|
}
|
|
// 加载记住的用户名 - 如果用户名为-1,则不显示
|
String savedUsername = UserChuShiHua.getProperty("userName");
|
if (savedUsername != null && !savedUsername.equals("-1")) {
|
usernameField.setText(savedUsername);
|
} else {
|
usernameField.setText("");
|
}
|
|
// 如果密码为-1,清空密码框
|
String savedPassword = UserChuShiHua.getProperty("password");
|
if (savedPassword != null && savedPassword.equals("-1")) {
|
passwordField.setText("");
|
}
|
}
|
|
private String getLanguageName(String languageCode) {
|
switch (languageCode) {
|
case "zh": return "中文";
|
case "en": return "English";
|
case "es": return "Español";
|
case "fr": return "Français";
|
case "de": return "Deutsch";
|
default: return "中文";
|
}
|
}
|
|
private void performLogin() {
|
String username = usernameField.getText().trim();
|
String password = new String(passwordField.getPassword()).trim();
|
|
// 输入验证
|
if (username.isEmpty()) {
|
JOptionPane.showMessageDialog(this,
|
"请输入用户名或邮箱",
|
"输入错误",
|
JOptionPane.WARNING_MESSAGE);
|
usernameField.requestFocus();
|
return;
|
}
|
|
if (password.isEmpty()) {
|
JOptionPane.showMessageDialog(this,
|
"请输入密码",
|
"输入错误",
|
JOptionPane.WARNING_MESSAGE);
|
passwordField.requestFocus();
|
return;
|
}
|
|
// 验证用户名和密码
|
if (validateLogin(username, password)) {
|
JOptionPane.showMessageDialog(this,
|
"登录成功!",
|
"成功",
|
JOptionPane.INFORMATION_MESSAGE);
|
|
// 更新最后登录时间
|
UserChuShiHua.updateProperty("lastLoginTime", String.valueOf(System.currentTimeMillis()));
|
|
// 如果记住我被选中,保存用户名
|
if (rememberMe.isSelected()) {
|
UserChuShiHua.updateProperty("userName", username);
|
}
|
|
// 这里可以添加跳转到主界面的代码
|
openMainApplication();
|
|
} else {
|
JOptionPane.showMessageDialog(this,
|
"用户名或密码错误!",
|
"登录失败",
|
JOptionPane.ERROR_MESSAGE);
|
passwordField.setText("");
|
passwordField.requestFocus();
|
}
|
}
|
|
private boolean validateLogin(String username, String password) {
|
// 从UserChuShiHua获取存储的用户数据进行比较
|
String storedUsername = UserChuShiHua.getProperty("userName");
|
String storedPassword = UserChuShiHua.getProperty("password");
|
String storedEmail = UserChuShiHua.getProperty("email");
|
|
// 检查用户名/邮箱和密码是否匹配
|
boolean usernameMatch = username.equals(storedUsername) || username.equals(storedEmail);
|
boolean passwordMatch = password.equals(storedPassword);
|
|
return usernameMatch && passwordMatch;
|
}
|
|
private void openMainApplication() {
|
// 这里可以打开主应用程序窗口
|
System.out.println("登录成功,准备打开主应用程序...");
|
|
// 演示:3秒后关闭登录窗口
|
Timer timer = new Timer(1000, e -> {
|
dispose();
|
System.out.println("登录窗口已关闭,主应用程序已启动");
|
});
|
timer.setRepeats(false);
|
timer.start();
|
}
|
|
// 注册窗口方法
|
private void openRegistrationWindow() {
|
// 创建注册窗口实例,传递当前语言代码
|
RegistrationFrame registerFrame = new RegistrationFrame(this, currentLanguageCode);
|
registerFrame.setVisible(true);
|
}
|
|
}
|