package window; // °üÉùÃ÷ import java.awt.*; // µ¼ÈëAWT°ü import java.sql.Connection; // µ¼ÈëÊý¾Ý¿âÁ¬½ÓÀà import java.sql.ResultSet; // µ¼Èë½á¹û¼¯Àà import java.sql.Statement; // µ¼ÈëSQLÓï¾äÀà import javax.swing.*; // µ¼ÈëSwing°ü import javax.swing.border.EmptyBorder; // µ¼Èë¿Õ±ß¿òÀà import java.util.ResourceBundle; // µ¼Èë×ÊÔ´ÊøÀà import udptcp.UDPPortAReceiver; // µ¼ÈëUDP¶Ë¿ÚA½ÓÊÕÆ÷ import udptcp.UDPPortBReceiver; // µ¼ÈëUDP¶Ë¿ÚB½ÓÊÕÆ÷ import javax.swing.plaf.basic.BasicInternalFrameUI; // µ¼Èë»ù´¡ÄÚ²¿¿ò¼ÜUI public class WelcomeFrame extends JInternalFrame { // »¶Ó¿ò¼ÜÀà private static final long serialVersionUID = 1L; // ÐòÁл¯°æ±¾ID private ResourceBundle messages; // ÏûÏ¢×ÊÔ´Êø private Connection conn; // Êý¾Ý¿âÁ¬½Ó private Timer statsTimer; // ͳ¼Æ¶¨Ê±Æ÷ private JLabel udpAPacketCountLabel; // UDP¶Ë¿ÚA°ü¼ÆÊý±êÇ© private JLabel udpBPacketCountLabel; // UDP¶Ë¿ÚB°ü¼ÆÊý±êÇ© private JLabel memoryUsageLabel; // ÄÚ´æÊ¹ÓñêÇ© private JLabel threadCountLabel; // Ï̼߳ÆÊý±êÇ© public WelcomeFrame(ResourceBundle messages, Connection conn) { // ¹¹Ô캯Êý super("", true, true, true, true); // µ÷Óø¸À๹Ô캯Êý£¬ÉèÖñêÌâΪ¿Õ this.messages = messages; // ³õʼ»¯ÏûÏ¢×ÊÔ´Êø this.conn = conn; // ³õʼ»¯Êý¾Ý¿âÁ¬½Ó initializeFrame(); // ³õʼ»¯¿ò¼Ü setContentPane(createWelcomePanel()); // ÉèÖÃÄÚÈÝÃæ°å startStatsTimer(); // Æô¶¯Í³¼Æ¶¨Ê±Æ÷ } private void initializeFrame() { // ³õʼ»¯¿ò¼Ü·½·¨ setSize(900, 700); // ÉèÖÿò¼Ü´óС setLocation(100, 100); // ÉèÖÿò¼ÜλÖà setMaximizable(true); // ÉèÖÿÉ×î´ó»¯ setIconifiable(true); // ÉèÖÿÉͼ±ê»¯ setClosable(true); // ÉèÖÃ¿É¹Ø±Õ setBorder(null); // ÒÆ³ý±ß¿ò setVisible(true); // ÉèÖÿɼû // ÒÆ³ý±êÌâÀ¸ BasicInternalFrameUI ui = (BasicInternalFrameUI) this.getUI(); // »ñÈ¡UI×é¼þ ui.setNorthPane(null); // ÒÆ³ý±êÌâÀ¸ try { setMaximum(true); // ³¢ÊÔ×î´ó»¯´°¿Ú } catch (java.beans.PropertyVetoException e) { e.printStackTrace(); // ´òÓ¡Òì³£¶ÑÕ» } } private JPanel createWelcomePanel() { // ´´½¨»¶ÓÃæ°å·½·¨ JPanel panel = new BackgroundPanel(); // ´´½¨±³¾°Ãæ°å panel.setLayout(new BorderLayout()); // ÉèÖñ߽粼¾Ö panel.setBorder(new EmptyBorder(30, 30, 30, 30)); // ÉèÖÿձ߿ò // ´´½¨±êÌâÃæ°å JPanel titlePanel = new JPanel(new BorderLayout()); // ´´½¨±ß½ç²¼¾ÖÃæ°å titlePanel.setOpaque(false); // ÉèÖÃ͸Ã÷ JLabel titleLabel = new JLabel(messages.getString("APP_NAME"), SwingConstants.CENTER); // ´´½¨Ó¦ÓÃÃû³Æ±êÇ© titleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 42)); // ÉèÖÃ×ÖÌå titleLabel.setForeground(new Color(25, 25, 112)); // ÉèÖÃǰ¾°É« titleLabel.setBorder(new EmptyBorder(20, 0, 20, 0)); // ÉèÖÿձ߿ò titleLabel.setOpaque(false); // ÉèÖÃ͸Ã÷ JLabel subtitleLabel = new JLabel(messages.getString("WELCOME_MSG"), SwingConstants.CENTER); // ´´½¨»¶ÓÏûÏ¢±êÇ© subtitleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.ITALIC, 22)); // ÉèÖÃ×ÖÌå subtitleLabel.setForeground(new Color(70, 130, 180)); // ÉèÖÃǰ¾°É« subtitleLabel.setOpaque(false); // ÉèÖÃ͸Ã÷ titlePanel.add(titleLabel, BorderLayout.NORTH); // Ìí¼Ó±êÌâµ½±±²¿ titlePanel.add(subtitleLabel, BorderLayout.CENTER); // Ìí¼Ó¸±±êÌâµ½Öв¿ // ´´½¨ÐÅÏ¢Ãæ°å JPanel infoPanel = new JPanel(new GridLayout(0, 2, 20, 20)); // ´´½¨Íø¸ñ²¼¾ÖÃæ°å infoPanel.setBorder(new EmptyBorder(30, 50, 30, 50)); // ÉèÖÿձ߿ò infoPanel.setBackground(new Color(255, 255, 255, 180)); // ÉèÖðë͸Ã÷°×É«±³¾° infoPanel.setOpaque(true); // ÉèÖò»Í¸Ã÷ // Ìí¼Óϵͳ״̬ÐÅÏ¢ infoPanel.add(createInfoLabel(messages.getString("SYSTEM_STATUS"), messages.getString("RUNNING_NORMAL"), new Color(0, 100, 0))); // ÉîÂÌÉ« // Ìí¼ÓÊý¾Ý¿âÁ¬½ÓÐÅÏ¢ infoPanel.add(createInfoLabel(messages.getString("DB_CONNECTION"), conn != null ? messages.getString("CONNECTED") : messages.getString("DISCONNECTED"), conn != null ? new Color(0, 100, 0) : Color.RED)); // Á¬½Ó³É¹¦ÂÌÉ«/ʧ°ÜºìÉ« try { if (conn != null) { // ¼ì²éÊý¾Ý¿âÁ¬½Ó try (Statement stmt = conn.createStatement(); // ´´½¨Óï¾ä ResultSet rs = stmt.executeQuery("SELECT VERSION()")) { // Ö´Ðа汾²éѯ if (rs.next()) { // Èç¹ûÓнá¹û infoPanel.add(createInfoLabel(messages.getString("DB_VERSION"), rs.getString(1), new Color(25, 25, 112))); // Ìí¼ÓÊý¾Ý¿â°æ±¾ } } } } catch (Exception e) { e.printStackTrace(); // ´òÓ¡Òì³£ } // Ìí¼Óµ±Ç°Óû§ÐÅÏ¢ infoPanel.add(createInfoLabel(messages.getString("CURRENT_USER"), messages.getString("ADMIN"), new Color(25, 25, 112))); // ÉîÀ¶É« // Ìí¼Óϵͳʱ¼äÐÅÏ¢ infoPanel.add(createInfoLabel(messages.getString("SYSTEM_TIME"), new java.util.Date().toString(), new Color(25, 25, 112))); // ÉîÀ¶É« // Ìí¼ÓUDP¶Ë¿ÚAͳ¼Æ infoPanel.add(createInfoLabel(messages.getString("UDP_PORT_A"), "0", new Color(178, 34, 34))); // שºìÉ« udpAPacketCountLabel = createInfoLabel("", "", new Color(178, 34, 34)); // ´´½¨¼ÆÊý±êÇ© infoPanel.add(udpAPacketCountLabel); // Ìí¼Ó¼ÆÊý±êÇ© // Ìí¼ÓUDP¶Ë¿ÚBͳ¼Æ infoPanel.add(createInfoLabel(messages.getString("UDP_PORT_B"), "0", new Color(178, 34, 34))); // שºìÉ« udpBPacketCountLabel = createInfoLabel("", "", new Color(178, 34, 34)); // ´´½¨¼ÆÊý±êÇ© infoPanel.add(udpBPacketCountLabel); // Ìí¼Ó¼ÆÊý±êÇ© // Ìí¼ÓÄÚ´æÊ¹ÓÃͳ¼Æ infoPanel.add(createInfoLabel(messages.getString("MEMORY_USAGE"), "", new Color(148, 0, 211))); // ×ÏÂÞÀ¼É« memoryUsageLabel = createInfoLabel("", "", new Color(148, 0, 211)); // ´´½¨ÄÚ´æ±êÇ© infoPanel.add(memoryUsageLabel); // Ìí¼ÓÄÚ´æ±êÇ© // Ìí¼ÓÏ̼߳ÆÊýͳ¼Æ infoPanel.add(createInfoLabel(messages.getString("THREAD_COUNT"), "", new Color(148, 0, 211))); // ×ÏÂÞÀ¼É« threadCountLabel = createInfoLabel("", "", new Color(148, 0, 211)); // ´´½¨Ï̱߳êÇ© infoPanel.add(threadCountLabel); // Ìí¼ÓÏ̱߳êÇ© // ´´½¨×´Ì¬Ãæ°å JPanel statsPanel = new JPanel(new GridLayout(1, 4, 15, 15)); // ´´½¨Íø¸ñ²¼¾ÖÃæ°å statsPanel.setBorder(new EmptyBorder(20, 50, 10, 50)); // ÉèÖÿձ߿ò statsPanel.setOpaque(false); // ÉèÖÃ͸Ã÷ // Ìí¼Óͳ¼ÆºÐ×Ó statsPanel.add(createStatBox(messages.getString("UDP_PORT_A_STAT"), udpAPacketCountLabel)); // UDP¶Ë¿ÚAͳ¼Æ statsPanel.add(createStatBox(messages.getString("UDP_PORT_B_STAT"), udpBPacketCountLabel)); // UDP¶Ë¿ÚBͳ¼Æ statsPanel.add(createStatBox(messages.getString("MEMORY_USAGE_STAT"), memoryUsageLabel)); // ÄÚ´æÊ¹ÓÃͳ¼Æ statsPanel.add(createStatBox(messages.getString("THREAD_COUNT_STAT"), threadCountLabel)); // Ï̼߳ÆÊýͳ¼Æ // ×é×°Ö÷Ãæ°å panel.add(titlePanel, BorderLayout.NORTH); // Ìí¼Ó±êÌâÃæ°åµ½±±²¿ panel.add(infoPanel, BorderLayout.CENTER); // Ìí¼ÓÐÅÏ¢Ãæ°åµ½Öв¿ panel.add(statsPanel, BorderLayout.SOUTH); // Ìí¼Ó×´Ì¬Ãæ°åµ½Äϲ¿ return panel; // ·µ»ØÃæ°å } private JLabel createInfoLabel(String title, String value, Color color) { // ´´½¨ÐÅÏ¢±êÇ©·½·¨ JLabel label = new JLabel("