package denglu;
|
|
import homein.WenJianSuo;
|
import ui.UIConfig;
|
import zhuye.Shouye;
|
import gecaoji.Device;
|
import chuankou.SerialPortNativeLoader;
|
import set.Setsys;
|
import udpdell.UDPServer;
|
import user.Usrdell;
|
import Mqttmessage.Client;
|
import login.LoginVerifier;
|
import publicway.buttonset;
|
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 Map<String, Map<String, String>> translations;
|
private JPanel mainPanel;
|
private JLabel usernameLabel, passwordLabel;
|
private JLabel forgotPassword, noAccountLabel, signupLink;
|
|
// 主题颜色
|
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("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("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("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("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("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 bottomPanel = createBottomPanel();
|
|
mainPanel.add(topPanel, BorderLayout.NORTH);
|
mainPanel.add(formPanel, BorderLayout.CENTER);
|
mainPanel.add(bottomPanel, 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);
|
|
// 登录按钮 - 使用buttonset创建,水平居中,长度与文本框宽度保持相近
|
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
|
buttonPanel.setBackground(Color.WHITE);
|
buttonPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 50));
|
|
// 使用buttonset创建登录按钮,使用主题色
|
loginButton = buttonset.createStyledButton("登录", THEME_COLOR);
|
loginButton.setFont(new Font("PingFang SC", Font.BOLD, 15));
|
// 设置登录按钮长度接近文本框宽度
|
loginButton.setPreferredSize(new Dimension(300, 48));
|
loginButton.setMinimumSize(new Dimension(300, 48));
|
loginButton.setMaximumSize(new Dimension(300, 48));
|
|
buttonPanel.add(loginButton);
|
|
// 组装表单
|
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); // 登录按钮
|
|
return formPanel;
|
}
|
|
private JPanel createBottomPanel() {
|
JPanel bottomPanel = new JPanel();
|
bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.Y_AXIS));
|
bottomPanel.setBackground(Color.WHITE);
|
|
// 注册链接(放到页面最下方)
|
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);
|
signupPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 5, 0));
|
|
// 注册链接放在最底部
|
bottomPanel.add(signupPanel);
|
|
return bottomPanel;
|
}
|
|
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) {
|
new user.ZhaohuiMima(Denglu.this).setVisible(true);
|
}
|
});
|
|
// 注册链接点击事件 - 打开注册窗口
|
signupLink.addMouseListener(new MouseAdapter() {
|
public void mouseClicked(MouseEvent 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()));
|
|
// 更新窗口标题
|
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("");
|
}
|
|
// 加载记住我状态
|
String rememberPwd = UserChuShiHua.getProperty("rememberPassword");
|
boolean isRemember = "1".equals(rememberPwd);
|
rememberMe.setSelected(isRemember);
|
|
// 如果记住我被选中,填充密码并自动登录(延迟执行,确保窗口已显示)
|
if (isRemember) {
|
String savedPassword = UserChuShiHua.getProperty("password");
|
String savedEmail = UserChuShiHua.getProperty("email");
|
if (savedPassword != null && !savedPassword.equals("-1") &&
|
savedEmail != null && !savedEmail.equals("-1")) {
|
passwordField.setText(savedPassword);
|
// 延迟执行自动登录,确保窗口已经显示
|
SwingUtilities.invokeLater(() -> {
|
performAutoLogin(savedEmail, savedPassword);
|
});
|
}
|
}
|
}
|
|
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 usernameOrEmail = usernameField.getText().trim();
|
String password = new String(passwordField.getPassword()).trim();
|
|
// 输入验证
|
if (usernameOrEmail.isEmpty()) {
|
JOptionPane.showMessageDialog(this,
|
"请输入用户名或邮箱",
|
"输入错误",
|
JOptionPane.WARNING_MESSAGE);
|
usernameField.requestFocus();
|
return;
|
}
|
|
if (password.isEmpty()) {
|
JOptionPane.showMessageDialog(this,
|
"请输入密码",
|
"输入错误",
|
JOptionPane.WARNING_MESSAGE);
|
passwordField.requestFocus();
|
return;
|
}
|
|
// 获取邮箱地址(如果输入的是用户名,从配置文件中获取对应的邮箱)
|
String email = getEmailFromInput(usernameOrEmail);
|
|
// 禁用登录按钮,防止重复点击
|
loginButton.setEnabled(false);
|
|
// 在新线程中调用API,避免阻塞UI
|
new Thread(() -> {
|
try {
|
// 调用登录验证API
|
LoginVerifier.LoginVerifyResponse response = LoginVerifier.verifyLogin(email, password);
|
|
// 在EDT线程中更新UI
|
SwingUtilities.invokeLater(() -> {
|
loginButton.setEnabled(true);
|
|
if (response.isSuccess()) {
|
// 登录成功
|
// 更新最后登录时间
|
UserChuShiHua.updateProperty("lastLoginTime", String.valueOf(System.currentTimeMillis()));
|
|
// 保存记住我状态
|
if (rememberMe.isSelected()) {
|
UserChuShiHua.updateProperty("rememberPassword", "1");
|
UserChuShiHua.updateProperty("userName", usernameOrEmail);
|
UserChuShiHua.updateProperty("email", email);
|
UserChuShiHua.updateProperty("password", password);
|
} else {
|
UserChuShiHua.updateProperty("rememberPassword", "0");
|
}
|
|
// 关闭登录窗口并打开首页
|
openMainApplication();
|
} else {
|
// 登录失败,显示错误信息
|
String errorMessage = response.getMessage() != null ?
|
response.getMessage() : "用户名或密码错误!";
|
JOptionPane.showMessageDialog(this,
|
errorMessage,
|
"登录失败",
|
JOptionPane.ERROR_MESSAGE);
|
passwordField.setText("");
|
passwordField.requestFocus();
|
}
|
});
|
} catch (Exception e) {
|
// 异常处理,恢复按钮并显示错误
|
SwingUtilities.invokeLater(() -> {
|
loginButton.setEnabled(true);
|
JOptionPane.showMessageDialog(this,
|
"登录时发生错误: " + e.getMessage(),
|
"错误",
|
JOptionPane.ERROR_MESSAGE);
|
passwordField.setText("");
|
passwordField.requestFocus();
|
});
|
}
|
}).start();
|
}
|
|
// 邮箱验证方法
|
private boolean isValidEmail(String email) {
|
// 简单的邮箱格式验证
|
String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
|
return email != null && email.matches(emailRegex);
|
}
|
|
// 获取邮箱地址(如果输入的是用户名,则从配置文件中获取邮箱)
|
private String getEmailFromInput(String usernameOrEmail) {
|
// 如果输入的是邮箱格式,直接返回
|
if (isValidEmail(usernameOrEmail)) {
|
return usernameOrEmail;
|
}
|
// 否则,从配置文件中获取保存的邮箱
|
String savedEmail = UserChuShiHua.getProperty("email");
|
if (savedEmail != null && !savedEmail.equals("-1")) {
|
// 检查输入的用户名是否匹配保存的用户名
|
String savedUsername = UserChuShiHua.getProperty("userName");
|
if (usernameOrEmail.equals(savedUsername)) {
|
return savedEmail;
|
}
|
}
|
// 如果找不到邮箱,返回输入的字符串(可能是邮箱格式但验证失败,或者用户名不存在)
|
return usernameOrEmail;
|
}
|
|
// 自动登录(从配置文件读取邮箱和密码)
|
private void performAutoLogin(String email, String password) {
|
// 在新线程中调用API,避免阻塞UI
|
new Thread(() -> {
|
try {
|
LoginVerifier.LoginVerifyResponse response = LoginVerifier.verifyLogin(email, password);
|
|
SwingUtilities.invokeLater(() -> {
|
if (response.isSuccess()) {
|
// 登录成功,跳转到主页
|
openMainApplication();
|
} else {
|
// 登录失败,清空密码字段,让用户重新输入
|
passwordField.setText("");
|
usernameField.requestFocus();
|
}
|
});
|
} catch (Exception e) {
|
// 异常处理,清空密码字段
|
SwingUtilities.invokeLater(() -> {
|
passwordField.setText("");
|
usernameField.requestFocus();
|
});
|
}
|
}).start();
|
}
|
|
private void openMainApplication() {
|
launchMainApp();
|
dispose();
|
}
|
|
public static void launchMainApp() {
|
SwingUtilities.invokeLater(new Runnable() {
|
@Override
|
public void run() {
|
JFrame mainFrame = new JFrame("智能割草系统");
|
mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
|
|
Shouye homePanel = new Shouye();
|
mainFrame.setContentPane(homePanel);
|
|
// 设置与登录页面相同的尺寸
|
mainFrame.setSize(UIConfig.DIALOG_WIDTH, UIConfig.DIALOG_HEIGHT);
|
mainFrame.setMinimumSize(new Dimension(UIConfig.DIALOG_WIDTH, UIConfig.DIALOG_HEIGHT));
|
mainFrame.setResizable(true);
|
mainFrame.setLocationRelativeTo(null);
|
mainFrame.setVisible(true);
|
|
// 启动后连接MQTT
|
new Thread(new Runnable() {
|
@Override
|
public void run() {
|
Client.lianjiemqqt();
|
}
|
}).start();
|
}
|
});
|
}
|
|
// 注册窗口方法
|
private void openRegistrationWindow() {
|
// 创建注册窗口实例,传递当前语言代码
|
RegistrationFrame registerFrame = new RegistrationFrame(this, currentLanguageCode);
|
registerFrame.setVisible(true);
|
}
|
|
/**
|
* 程序入口点
|
* 集成Homein类的初始化逻辑
|
*/
|
public static void main(String[] args) {
|
// 检查程序是否已经运行
|
if (WenJianSuo.isAlreadyRunning()) {
|
JOptionPane.showMessageDialog(null,
|
"程序已经在运行中!\n不能同时打开多个实例。",
|
"警告",
|
JOptionPane.WARNING_MESSAGE);
|
System.exit(0);
|
return;
|
}
|
|
// 添加关闭钩子,确保程序退出时释放锁
|
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
WenJianSuo.releaseLock();
|
}));
|
|
try {
|
SerialPortNativeLoader.ensureLibraryPresent();
|
// 初始化数据
|
UserChuShiHua.initialize();
|
Usrdell.initialize(); // 初始化用户属性
|
|
Setsys setsys = new Setsys();
|
setsys.initializeFromProperties();
|
Device.initializeActiveDevice(setsys.getMowerId());
|
|
UDPServer.startAsync();//启动数据接收线程
|
|
// 启动登录界面(自动登录逻辑在 loadUserPreferences 中处理)
|
EventQueue.invokeLater(() -> {
|
try {
|
new Denglu().setVisible(true);
|
} catch (Exception e) {
|
e.printStackTrace();
|
JOptionPane.showMessageDialog(null,
|
"登录界面启动失败: " + e.getMessage(),
|
"错误",
|
JOptionPane.ERROR_MESSAGE);
|
}
|
});
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
JOptionPane.showMessageDialog(null,
|
"程序启动失败: " + e.getMessage(),
|
"错误",
|
JOptionPane.ERROR_MESSAGE);
|
}
|
}
|
|
}
|