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("
" + title + "
" + value + "
"); // ´´½¨´øHTML¸ñʽµÄ±êÇ© label.setFont(new Font(messages.getString("FONT_NAME"), Font.PLAIN, 16)); // ÉèÖÃ×ÖÌå label.setForeground(color); // ÉèÖÃǰ¾°É« label.setHorizontalAlignment(SwingConstants.CENTER); // ÉèÖÃˮƽ¾ÓÖÐ label.setVerticalAlignment(SwingConstants.CENTER); // ÉèÖô¹Ö±¾ÓÖÐ label.setOpaque(false); // ÉèÖÃ͸Ã÷ return label; // ·µ»Ø±êÇ© } private JPanel createStatBox(String title, JLabel valueLabel) { // ´´½¨Í³¼ÆºÐ×Ó·½·¨ JPanel boxPanel = new JPanel(new BorderLayout()); // ´´½¨±ß½ç²¼¾ÖÃæ°å boxPanel.setBorder(BorderFactory.createCompoundBorder( // ÉèÖø´ºÏ±ß¿ò BorderFactory.createLineBorder(new Color(70, 130, 180), 2), // À¶É«±ß¿ò new EmptyBorder(15, 10, 15, 10) // Äڱ߾à )); boxPanel.setBackground(new Color(240, 248, 255, 220)); // ÉèÖðë͸Ã÷±³¾° boxPanel.setOpaque(true); // ÉèÖò»Í¸Ã÷ JLabel titleLabel = new JLabel(title, SwingConstants.CENTER); // ´´½¨±êÌâ±êÇ© titleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18)); // ÉèÖôÖÌå titleLabel.setForeground(new Color(25, 25, 112)); // ÉèÖÃÉîÀ¶É« valueLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 24)); // ÉèÖôÖÌå´ó×ֺŠvalueLabel.setHorizontalAlignment(SwingConstants.CENTER); // ÉèÖþÓÖÐ boxPanel.add(titleLabel, BorderLayout.NORTH); // Ìí¼Ó±êÌâµ½±±²¿ boxPanel.add(valueLabel, BorderLayout.CENTER); // Ìí¼ÓÖµ±êÇ©µ½Öв¿ return boxPanel; // ·µ»ØÃæ°å } private void startStatsTimer() { // Æô¶¯Í³¼Æ¶¨Ê±Æ÷·½·¨ statsTimer = new Timer(1000, e -> { // ´´½¨1Ãë¼ä¸ôµÄ¶¨Ê±Æ÷ // ¸üÐÂUDPÊý¾Ý°ü¼ÆÊý udpAPacketCountLabel.setText(String.valueOf(UDPPortAReceiver.getPacketCount())); // ¸üж˿ÚA¼ÆÊý udpBPacketCountLabel.setText(String.valueOf(UDPPortBReceiver.getPacketCount())); // ¸üж˿ÚB¼ÆÊý // ¸üÐÂÄÚ´æÊ¹ÓÃÇé¿ö Runtime runtime = Runtime.getRuntime(); // »ñÈ¡ÔËÐÐʱʵÀý long usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024); // ¼ÆËãÒÑÓÃÄÚ´æ(MB) long maxMemory = runtime.maxMemory() / (1024 * 1024); // ¼ÆËã×î´óÄÚ´æ(MB) memoryUsageLabel.setText(usedMemory + " " + messages.getString("MB") + " / " + maxMemory + " " + messages.getString("MB")); // ÉèÖÃÄÚ´æÎı¾ // ¸üÐÂÏß³ÌÊýÁ¿ threadCountLabel.setText(String.valueOf(Thread.activeCount())); // ÉèÖûÏß³ÌÊý }); statsTimer.start(); // Æô¶¯¶¨Ê±Æ÷ } @Override public void dispose() { // Ïú»Ù·½·¨ super.dispose(); // µ÷Óø¸ÀàÏú»Ù if (statsTimer != null) { // ¼ì²é¶¨Ê±Æ÷ statsTimer.stop(); // Í£Ö¹¶¨Ê±Æ÷ } } }