package dell_system; import javax.swing.*; import javax.swing.border.TitledBorder; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ResourceBundle; import dell_targets.Dell_tag; import publicsWay.Languages; import udptcp.UDPPortAReceiver; import udptcp.UDPPortBReceiver; public class MessageViewPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; private ResourceBundle messages; // ¹ú¼Ê»¯ÏûÏ¢×ÊÔ´°ü // UI×é¼þÉùÃ÷ private JButton btnStart, btnPause, btnClear, btnSend; // ¿ØÖư´Å¥£º¿ªÊ¼¡¢ÔÝÍ£¡¢Çå³ý¡¢·¢ËÍ private static JComboBox cbDataType; // ÏÂÀ­¿ò£ºÊý¾ÝÀàÐÍ¡¢Ð­Òé¡¢É豸ID private static JComboBox cbProtocol; private static JComboBox cbDeviceId; private static JComboBox cbRemoteDevice; // Ô¶³ÌÉ豸ÏÂÀ­¿ò private static JCheckBox chkAutoSave; // ¸´Ñ¡¿ò£º×Ô¶¯±£´æ¡¢ÏÔʾÀ´Ô´¡¢Ê®Áù½øÖÆÏÔʾ¡¢ASCIIÏÔʾ private static JCheckBox chkShowSource; private static JCheckBox chkHexDisplay; private static JCheckBox chkAsciiDisplay; private static JTextArea txtDataView; // Êý¾ÝÏÔÊ¾ÇøÓò private JScrollPane scrollPane; // ´ø¹ö¶¯ÌõµÄÃæ°å private JTextField txtSendData; // ·¢ËÍÊý¾ÝÎı¾¿ò private JRadioButton rdoSendHex; // HEX·¢Ë͵¥Ñ¡°´Å¥ private JRadioButton rdoSendAscii; // ASCII·¢Ë͵¥Ñ¡°´Å¥ private JCheckBox chkAppendNewline; // »Ø³µ»»Ðи´Ñ¡¿ò // Ìí¼Ó¾²Ì¬±äÁ¿¸ú×Ù´°¿Ú¿É¼û״̬ public static volatile boolean isWindowVisible = false; // ״̬±äÁ¿ private static boolean isCapturing = false; // ÊÇ·ñÕýÔÚ²¶»ñÊý¾ÝµÄ±êÖ¾ // ÐÞ¸ÄΪMap´æ´¢É豸¼°Æä±¾µØ¶Ë¿Ú private static Map remoteDeviceLocalPortMap = new HashMap<>(); // ¹¹Ô캯Êý public MessageViewPanel(ResourceBundle messages) { this.messages = messages; // ³õʼ»¯ÏûÏ¢×ÊÔ´°ü initializeUI(); // ³õʼ»¯Óû§½çÃæ } public void addNotify() { super.addNotify(); Window window = SwingUtilities.getWindowAncestor(this); if (window != null) { isWindowVisible = true; // Ãæ°åÒÑÌí¼Óµ½¿É¼û´°¿Ú window.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { isWindowVisible = false; } @Override public void windowClosed(WindowEvent e) { isWindowVisible = false; } }); } } // ³õʼ»¯UI×é¼þ private void initializeUI() { setLayout(new GridBagLayout()); // ʹÓÃÍø¸ñ´ü²¼¾Ö GridBagConstraints gbc = new GridBagConstraints(); // ²¼¾ÖÔ¼Êø¶ÔÏó gbc.insets = new Insets(5, 10, 5, 10); // ÉèÖÃ×é¼þ¼ä¾à£¨ÉÏ¡¢×ó¡¢Ï¡¢ÓÒ£© gbc.anchor = GridBagConstraints.WEST; // ×é¼þ¿¿×ó¶ÔÆë gbc.fill = GridBagConstraints.HORIZONTAL; // ˮƽÌî³ä setBackground(new Color(240, 245, 249)); // ÉèÖñ³¾°É« // ÏÂÀ­¿òÇøÓò gbc.gridx = 0; // ÆðʼÁÐ gbc.gridy = 0; // ÆðʼÐÐ gbc.gridwidth = 1; // Õ¼ÓÃ1Áпí¶È gbc.weightx = 0.25; // Ë®Æ½È¨ÖØ // Êý¾ÝÀàÐÍÏÂÀ­¿òÃæ°å JPanel dataTypePanel = new JPanel(new BorderLayout(5, 0)); // ʹÓñ߽粼¾Ö dataTypePanel.setBackground(new Color(240, 245, 249)); // ÉèÖñ³¾°É« dataTypePanel.add(createLabel(messages.getString("MESSAGE_VIEW_DATA_TYPE")), BorderLayout.WEST); // Ìí¼Ó±êÇ© cbDataType = new JComboBox<>(); // ´´½¨ÏÂÀ­¿ò loadtyps();// Ìí¼Ó"ËùÓÐÀàÐÍ"Ñ¡Ïî dataTypePanel.add(cbDataType, BorderLayout.CENTER); // ½«ÏÂÀ­¿òÌí¼Óµ½Ãæ°åÖÐÑë add(dataTypePanel, gbc); // ½«Ãæ°åÌí¼Óµ½Ö÷Ãæ°å // ЭÒéÏÂÀ­¿ò gbc.gridx++; // ÒÆ¶¯µ½ÏÂÒ»ÁÐ JPanel protocolPanel = new JPanel(new BorderLayout(5, 0)); // ЭÒéÑ¡ÔñÃæ°å protocolPanel.setBackground(new Color(240, 245, 249)); // ÉèÖñ³¾°É« protocolPanel.add(createLabel(messages.getString("MESSAGE_VIEW_PROTOCOL")), BorderLayout.WEST); // Ìí¼ÓЭÒé±êÇ© cbProtocol = new JComboBox<>(new String[]{ // ´´½¨Ð­ÒéÏÂÀ­¿ò²¢³õʼ»¯Ñ¡Ïî messages.getString("MESSAGE_VIEW_ALL_PROTOCOLS"), // ËùÓÐЭÒé "UDP", // UDPЭÒé "TCP", // TCPЭÒé "MQTT", // MQTTЭÒé "HTTP" // HTTPЭÒé }); protocolPanel.add(cbProtocol, BorderLayout.CENTER); // ½«ÏÂÀ­¿òÌí¼Óµ½Ãæ°åÖÐÑë add(protocolPanel, gbc); // ½«Ãæ°åÌí¼Óµ½Ö÷Ãæ°å // É豸IDÏÂÀ­¿ò gbc.gridx++; // ÒÆ¶¯µ½ÏÂÒ»ÁÐ JPanel devicePanel = new JPanel(new BorderLayout(5, 0)); // É豸IDÑ¡ÔñÃæ°å devicePanel.setBackground(new Color(240, 245, 249)); // ÉèÖñ³¾°É« devicePanel.add(createLabel(messages.getString("MESSAGE_VIEW_DEVICE_ID")), BorderLayout.WEST); // Ìí¼ÓÉ豸ID±êÇ© cbDeviceId = new JComboBox<>(); // ´´½¨É豸IDÏÂÀ­¿ò cbDeviceId.setEditable(true); // ÉèÖÃΪ¿É±à¼­£¬ÔÊÐíÊÖ¶¯ÊäÈëÉ豸ID cbDeviceId.addItem(messages.getString("MESSAGE_VIEW_ALL_DEVICES")); // Ìí¼Ó"ËùÓÐÉ豸"Ñ¡Ïî loadDeviceIds(); // ¼ÓÔØÉ豸IDÁбí devicePanel.add(cbDeviceId, BorderLayout.CENTER); // ½«ÏÂÀ­¿òÌí¼Óµ½Ãæ°åÖÐÑë add(devicePanel, gbc); // ½«Ãæ°åÌí¼Óµ½Ö÷Ãæ°å // Ô¶³ÌÉ豸ÏÂÀ­¿ò gbc.gridx++; // ÒÆ¶¯µ½ÏÂÒ»ÁÐ JPanel remoteDevicePanel = new JPanel(new BorderLayout(5, 0)); // Ô¶³ÌÉ豸ѡÔñÃæ°å remoteDevicePanel.setBackground(new Color(240, 245, 249)); // ÉèÖñ³¾°É« remoteDevicePanel.add(createLabel(messages.getString("MESSAGE_VIEW_REMOTE_DEVICE")), BorderLayout.WEST); // Ìí¼ÓÔ¶³ÌÉ豸±êÇ© cbRemoteDevice = new JComboBox<>(); // ´´½¨Ô¶³ÌÉ豸ÏÂÀ­¿ò cbRemoteDevice.setEditable(true); // ÉèÖÃΪ¿É±à¼­ cbRemoteDevice.addItem(messages.getString("MESSAGE_VIEW_ALL_DEVICES")); // Ìí¼Ó"ËùÓÐÉ豸"Ñ¡Ïî remoteDevicePanel.add(cbRemoteDevice, BorderLayout.CENTER); // ½«ÏÂÀ­¿òÌí¼Óµ½Ãæ°åÖÐÑë add(remoteDevicePanel, gbc); // ½«Ãæ°åÌí¼Óµ½Ö÷Ãæ°å // ¸´Ñ¡¿òÇøÓò gbc.gridx = 0; // ÖØÖÃÁÐλÖà gbc.gridy++; // ÒÆ¶¯µ½ÏÂÒ»ÐÐ gbc.gridwidth = 4; // ºá¿ç4ÁÐ gbc.weightx = 1.0; // Ë®Æ½È¨ÖØ JPanel checkboxPanel = new JPanel(new GridLayout(1, 4, 6, 0)); // ´´½¨Íø¸ñ²¼¾ÖÃæ°å£¨1ÐÐ4ÁУ© checkboxPanel.setBackground(new Color(240, 245, 249)); // ÉèÖñ³¾°É« chkAutoSave = createStyledCheckbox(messages.getString("MESSAGE_VIEW_AUTO_SAVE")); // ´´½¨×Ô¶¯±£´æ¸´Ñ¡¿ò chkShowSource = createStyledCheckbox(messages.getString("MESSAGE_VIEW_SHOW_SOURCE")); // ´´½¨ÏÔʾÀ´Ô´¸´Ñ¡¿ò chkHexDisplay = createStyledCheckbox(messages.getString("MESSAGE_VIEW_HEX_DISPLAY")); // ´´½¨Ê®Áù½øÖÆÏÔʾ¸´Ñ¡¿ò chkAsciiDisplay = createStyledCheckbox(messages.getString("MESSAGE_VIEW_ASCII_DISPLAY")); // ´´½¨ASCIIÏÔʾ¸´Ñ¡¿ò // ½«¸´Ñ¡¿òÌí¼Óµ½Ãæ°å checkboxPanel.add(chkAutoSave); checkboxPanel.add(chkShowSource); checkboxPanel.add(chkHexDisplay); checkboxPanel.add(chkAsciiDisplay); add(checkboxPanel, gbc); // ½«¸´Ñ¡¿òÃæ°åÌí¼Óµ½Ö÷Ãæ°å // Êý¾ÝÏÔÊ¾ÇøÓò gbc.gridy++; // ÒÆ¶¯µ½ÏÂÒ»ÐÐ gbc.weighty = 1.0; // ´¹Ö±È¨ÖØ gbc.fill = GridBagConstraints.BOTH; // Ë«ÏòÌî³ä txtDataView = new JTextArea(); // ´´½¨Îı¾ÇøÓò txtDataView.setFont(new Font("Monospaced", Font.PLAIN, 14)); // ÉèÖõȿí×ÖÌå txtDataView.setEditable(false); // ÉèÖÃΪ²»¿É±à¼­ scrollPane = new JScrollPane(txtDataView); // ´´½¨´ø¹ö¶¯ÌõµÄÃæ°å scrollPane.setPreferredSize(new Dimension(800, 400)); scrollPane.setBorder(BorderFactory.createTitledBorder( // ÉèÖôø±êÌâµÄ±ß¿ò BorderFactory.createLineBorder(new Color(180, 180, 220)), // ±ß¿òÑÕÉ« messages.getString("MESSAGE_VIEW_DATA_PANEL"), // ±êÌâÎı¾ TitledBorder.LEFT, // ±êÌâλÖà TitledBorder.TOP, // ±êÌâλÖà new Font("΢ÈíÑźÚ", Font.BOLD, 12), // ±êÌâ×ÖÌå new Color(70, 130, 180) // ±êÌâÑÕÉ« )); add(scrollPane, gbc); // ½«¹ö¶¯Ãæ°åÌí¼Óµ½Ö÷Ãæ°å // °´Å¥Ãæ°åÇøÓò gbc.gridy++; // ÒÆ¶¯µ½ÏÂÒ»ÐÐ gbc.weighty = 0; // ÖØÖô¹Ö±È¨ÖØ gbc.fill = GridBagConstraints.HORIZONTAL; // ˮƽÌî³ä // °´Å¥Ãæ°å JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5)); // ʹÓÃÁ÷ʽ²¼¾Ö£¨×ó¶ÔÆë£© buttonPanel.setBackground(new Color(240, 245, 249)); // ÉèÖñ³¾°É« btnStart = createStyledButton(messages.getString("MESSAGE_VIEW_START"), new Color(70, 130, 180)); // ´´½¨¿ªÊ¼°´Å¥£¨À¶É«£© btnPause = createStyledButton(messages.getString("MESSAGE_VIEW_PAUSE"), new Color(218, 165, 32)); // ´´½¨ÔÝÍ£°´Å¥£¨½ðÉ«£© btnClear = createStyledButton(messages.getString("MESSAGE_VIEW_CLEAR"), new Color(205, 92, 92)); // ´´½¨Çå³ý°´Å¥£¨ºìÉ«£© // ·¢ËÍÏà¹Ø¿Ø¼þ txtSendData = new JTextField(30); // ·¢ËÍÊý¾ÝÎı¾¿ò txtSendData.setFont(new Font("΢ÈíÑźÚ", Font.PLAIN, 12)); // ÉèÖÃ×ÖÌå btnSend = createStyledButton(messages.getString("MESSAGE_VIEW_SEND"), new Color(60, 179, 113)); // ´´½¨·¢ËͰ´Å¥£¨ÂÌÉ«£© // ´´½¨·¢ËÍÑ¡ÏîÃæ°å JPanel sendOptionsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); sendOptionsPanel.setBackground(new Color(240, 245, 249)); // ´´½¨µ¥Ñ¡°´Å¥×é ButtonGroup sendFormatGroup = new ButtonGroup(); // ´´½¨HEX·¢Ë͵¥Ñ¡°´Å¥ rdoSendHex = createStyledRadioButton(messages.getString("MESSAGE_VIEW_SEND_HEX")); // ´´½¨ASCII·¢Ë͵¥Ñ¡°´Å¥ rdoSendAscii = createStyledRadioButton(messages.getString("MESSAGE_VIEW_SEND_ASCII")); // ½«µ¥Ñ¡°´Å¥Ìí¼Óµ½°´Å¥×é sendFormatGroup.add(rdoSendHex); sendFormatGroup.add(rdoSendAscii); // ĬÈÏÑ¡ÖÐASCII·¢ËÍ rdoSendAscii.setSelected(true); // »Ø³µ»»Ðи´Ñ¡¿ò chkAppendNewline = createStyledCheckbox(messages.getString("MESSAGE_VIEW_APPEND_NEWLINE")); sendOptionsPanel.add(rdoSendHex); sendOptionsPanel.add(rdoSendAscii); sendOptionsPanel.add(chkAppendNewline); // ½«°´Å¥Ìí¼Óµ½°´Å¥Ãæ°å buttonPanel.add(btnStart); buttonPanel.add(btnPause); buttonPanel.add(btnClear); buttonPanel.add(txtSendData); buttonPanel.add(btnSend); buttonPanel.add(sendOptionsPanel); add(buttonPanel, gbc); // ½«°´Å¥Ãæ°åÌí¼Óµ½Ö÷Ãæ°å // ÉèÖð´Å¥¶¯×÷ setupActions(); } // ´´½¨´øÑùʽµÄ±êÇ© private JLabel createLabel(String text) { JLabel label = new JLabel(text); // ´´½¨±êÇ© label.setFont(new Font("΢ÈíÑźÚ", Font.BOLD, 12)); // ÉèÖÃ×ÖÌå label.setForeground(new Color(70, 70, 70)); // ÉèÖÃǰ¾°É« return label; } // ´´½¨´øÑùʽµÄ°´Å¥ private JButton createStyledButton(String text, Color bgColor) { JButton button = new JButton(text); // ´´½¨°´Å¥ button.setFont(new Font("΢ÈíÑźÚ", Font.BOLD, 12)); // ÉèÖÃ×ÖÌå button.setBackground(bgColor); // ÉèÖñ³¾°É« button.setForeground(Color.WHITE); // ÉèÖÃǰ¾°É«£¨°×É«£© button.setFocusPainted(false); // ½ûÓý¹µã±ß¿ò button.setBorder(BorderFactory.createCompoundBorder( // ÉèÖø´ºÏ±ß¿ò BorderFactory.createLineBorder(bgColor.darker(), 1), // Íⲿ±ß¿ò£¨ÉîÉ«£© BorderFactory.createEmptyBorder(5, 15, 5, 15) // ÄÚ²¿±ß¾à )); return button; } // ´´½¨´øÑùʽµÄ¸´Ñ¡¿ò private JCheckBox createStyledCheckbox(String text) { JCheckBox checkBox = new JCheckBox(text); // ´´½¨¸´Ñ¡¿ò checkBox.setFont(new Font("΢ÈíÑźÚ", Font.PLAIN, 12)); // ÉèÖÃ×ÖÌå checkBox.setBackground(new Color(240, 245, 249)); // ÉèÖñ³¾°É« checkBox.setForeground(new Color(70, 70, 70)); // ÉèÖÃǰ¾°É« return checkBox; } // ´´½¨´øÑùʽµÄµ¥Ñ¡°´Å¥ private JRadioButton createStyledRadioButton(String text) { JRadioButton radioButton = new JRadioButton(text); // ´´½¨µ¥Ñ¡°´Å¥ radioButton.setFont(new Font("΢ÈíÑźÚ", Font.PLAIN, 12)); // ÉèÖÃ×ÖÌå radioButton.setBackground(new Color(240, 245, 249)); // ÉèÖñ³¾°É« radioButton.setForeground(new Color(70, 70, 70)); // ÉèÖÃǰ¾°É« // ÃÀ»¯Ñ¡ÖÐЧ¹û radioButton.setIcon(new RadioButtonIcon(false)); radioButton.setSelectedIcon(new RadioButtonIcon(true)); // Ìí¼ÓÊó±êÐüͣЧ¹û radioButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseEntered(java.awt.event.MouseEvent evt) { radioButton.setForeground(new Color(30, 144, 255)); } public void mouseExited(java.awt.event.MouseEvent evt) { radioButton.setForeground(new Color(70, 70, 70)); } }); return radioButton; } // ×Ô¶¨Ò嵥ѡ°´Å¥Í¼±ê private static class RadioButtonIcon implements Icon { private static final int SIZE = 14; private final boolean selected; public RadioButtonIcon(boolean selected) { this.selected = selected; } @Override public void paintIcon(Component c, Graphics g, int x, int y) { Graphics2D g2d = (Graphics2D) g.create(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); if (selected) { // Ñ¡ÖÐ״̬ - À¶É«Ìî³ä g2d.setColor(new Color(70, 130, 180)); g2d.fillOval(x, y, SIZE, SIZE); // ÄÚÔ² - °×É« g2d.setColor(Color.WHITE); g2d.fillOval(x + SIZE/4, y + SIZE/4, SIZE/2, SIZE/2); } else { // δѡÖÐ״̬ - »ÒÉ«±ß¿ò g2d.setColor(new Color(150, 150, 150)); g2d.drawOval(x, y, SIZE-1, SIZE-1); } g2d.dispose(); } @Override public int getIconWidth() { return SIZE; } @Override public int getIconHeight() { return SIZE; } } // ¼ÓÔØÊý¾ÝÀàÐÍ private void loadtyps() { cbDataType.removeAllItems(); // Ìí¼Ó¹ú¼Ê»¯Ñ¡Ïî cbDataType.addItem(messages.getString("MESSAGE_VIEW_ALL_TYPES")); cbDataType.addItem(messages.getString("MESSAGE_VIEW_UDP_PORT_A")); cbDataType.addItem(messages.getString("MESSAGE_VIEW_UDP_PORT_B")); cbDataType.addItem(messages.getString("MESSAGE_VIEW_TCP_PORT")); cbDataType.addItem(messages.getString("MESSAGE_VIEW_MQTT_PORT")); } // ÉèÖð´Å¥¶¯×÷ private void setupActions() { btnStart.addActionListener(e -> startCapture()); // ¿ªÊ¼°´Å¥°ó¶¨¿ªÊ¼²¶»ñ·½·¨ btnPause.addActionListener(e -> pauseCapture()); // ÔÝÍ£°´Å¥°ó¶¨ÔÝÍ£²¶»ñ·½·¨ btnClear.addActionListener(e -> clearDisplay()); // Çå³ý°´Å¥°ó¶¨Çå³ýÏÔʾ·½·¨ btnSend.addActionListener(e -> sendData()); // ·¢ËͰ´Å¥°ó¶¨·¢ËÍ·½·¨ } // ¿ªÊ¼²¶»ñÊý¾Ý private void startCapture() { if (!isCapturing) { // Èç¹ûµ±Ç°Î´ÔÚ²¶»ñ״̬ isCapturing = true; // ÉèÖò¶»ñ״̬Ϊtrue btnStart.setEnabled(false); // ½ûÓÿªÊ¼°´Å¥ btnPause.setEnabled(true); // ÆôÓÃÔÝÍ£°´Å¥ // Æô¶¯Êý¾Ý²¶»ñÏß³Ì } } // ÔÝÍ£²¶»ñÊý¾Ý private void pauseCapture() { isCapturing = false; // ÉèÖò¶»ñ״̬Ϊfalse btnStart.setEnabled(true); // ÆôÓÿªÊ¼°´Å¥ btnPause.setEnabled(false); // ½ûÓÃÔÝÍ£°´Å¥ } // Çå³ýÊý¾ÝÏÔʾ private void clearDisplay() { txtDataView.setText(""); // Çå¿ÕÎı¾ÇøÓò } // ·¢ËÍÊý¾Ýµ½Ô¶³ÌÉ豸 private void sendData() { // ʹÓÃз½·¨»ñÈ¡µ±Ç°×ÊÔ´°ü ResourceBundle currentMessages = Languages.getCurrentMessages(); String selectedDevice = (String) cbRemoteDevice.getSelectedItem(); if (selectedDevice == null || selectedDevice.equals(currentMessages.getString("MESSAGE_VIEW_ALL_DEVICES"))) { JOptionPane.showMessageDialog(this, currentMessages.getString("MESSAGE_VIEW_SELECT_DEVICE"), currentMessages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); return; } // »ñÈ¡±¾µØ¶Ë¿Ú Integer localPort = remoteDeviceLocalPortMap.get(selectedDevice); if (localPort == null) { JOptionPane.showMessageDialog(this, "ÎÞ·¨È·¶¨É豸µÄ½ÓÊÕ¶Ë¿Ú", currentMessages.getString("ERROR"), JOptionPane.ERROR_MESSAGE); return; } // ½âÎöIPºÍ¶Ë¿Ú String[] parts = selectedDevice.split(":"); if (parts.length != 2) { JOptionPane.showMessageDialog(this, currentMessages.getString("MESSAGE_VIEW_INVALID_DEVICE"), currentMessages.getString("ERROR"), JOptionPane.ERROR_MESSAGE); return; } String ip = parts[0]; int port; try { port = Integer.parseInt(parts[1]); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, currentMessages.getString("MESSAGE_VIEW_INVALID_PORT"), currentMessages.getString("ERROR"), JOptionPane.ERROR_MESSAGE); return; } String dataToSend = txtSendData.getText(); if (dataToSend.isEmpty()) { JOptionPane.showMessageDialog(this, currentMessages.getString("MESSAGE_VIEW_EMPTY_DATA"), currentMessages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); return; } // Ìí¼Ó»Ø³µ»»ÐÐ if (chkAppendNewline.isSelected()) { dataToSend += "\r\n"; } // ¼Ç¼·¢ËÍÊý¾Ýµ½½çÃæ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String timestamp = sdf.format(new Date()); StringBuilder displayData = new StringBuilder(); displayData.append("[SEND][").append(timestamp).append("][").append(ip).append(":").append(port).append("] "); if (rdoSendHex.isSelected()) { // HEX¸ñʽ·¢ËÍ String hexData = toHexString(dataToSend); displayData.append(hexData); if (localPort == UDPPortAReceiver.PORT) { // ´«ÈëÊÇ·ñHEX·¢Ë͵ıêÖ¾ UDPPortAReceiver.sendData(ip, port, dataToSend, true); } else if (localPort == UDPPortBReceiver.PORT) { // ´«ÈëÊÇ·ñHEX·¢Ë͵ıêÖ¾ UDPPortBReceiver.sendData(ip, port, dataToSend, true); } } else { // ASCII¸ñʽ·¢ËÍ displayData.append(dataToSend); // ʵ¼Ê·¢ËÍASCIIÊý¾Ý£¨ÕâÀïÐèÒªµ÷ÓÃUDP·¢ËÍ·½·¨£© if (localPort == UDPPortAReceiver.PORT) { UDPPortAReceiver.sendData(ip, port, dataToSend, false); } else if (localPort == UDPPortBReceiver.PORT) { UDPPortBReceiver.sendData(ip, port, dataToSend, false); } } // ÔÚEDTÏß³ÌÖиüÐÂUI SwingUtilities.invokeLater(() -> { txtDataView.append(displayData.toString() + "\n"); // ×Ô¶¯¹ö¶¯µ½µ×²¿ txtDataView.setCaretPosition(txtDataView.getDocument().getLength()); }); } // ÐÞ¸ÄÌí¼ÓÔ¶³ÌÉ豸·½·¨ // ÔÚMessageViewPanelÀàÖÐÐÞ¸ÄaddRemoteDevice·½·¨ public static void addRemoteDevice(String ip, int port, int localPort) { String device = ip + ":" + port; if (!remoteDeviceLocalPortMap.containsKey(device)) { remoteDeviceLocalPortMap.put(device, localPort); SwingUtilities.invokeLater(() -> { // ¼ì²éÏÂÀ­¿òÖÐÊÇ·ñÒÑ´æÔÚ¸ÃÉ豸 boolean exists = false; ComboBoxModel model = cbRemoteDevice.getModel(); for (int i = 0; i < model.getSize(); i++) { if (device.equals(model.getElementAt(i))) { exists = true; break; } } if (!exists) { cbRemoteDevice.addItem(device); } }); } } // ²¶»ñÊý¾ÝµÄºËÐÄ·½·¨ // ÐÞ¸ÄͨÓÃÊý¾ÝÏÔʾ·½·¨ public static void showData(String rawData, String ip, int port, int localPort, String deviceId) { if (!isWindowVisible) { return; } // »ñÈ¡µ±Ç°Ñ¡Ôñ String selectedDataType = (String) cbDataType.getSelectedItem(); String selectedProtocol = (String) cbProtocol.getSelectedItem(); String selectedDeviceId = (String) cbDeviceId.getSelectedItem(); // ʹÓÃз½·¨»ñÈ¡µ±Ç°×ÊÔ´°ü ResourceBundle messages = Languages.getCurrentMessages(); String allTypes = messages.getString("MESSAGE_VIEW_ALL_TYPES"); String allProtocols = messages.getString("MESSAGE_VIEW_ALL_PROTOCOLS"); String allDevices = messages.getString("MESSAGE_VIEW_ALL_DEVICES"); String udpPortA = messages.getString("MESSAGE_VIEW_UDP_PORT_A"); String udpPortB = messages.getString("MESSAGE_VIEW_UDP_PORT_B"); String udpProtocol = "UDP"; // Ö±½ÓʹÓÃЭÒéÃû³Æ // ¼ì²éÊý¾ÝÀàÐ͹ýÂË boolean dataTypeMatch = selectedDataType.equals(allTypes) || (localPort == UDPPortAReceiver.PORT && selectedDataType.equals(udpPortA)) || (localPort == UDPPortBReceiver.PORT && selectedDataType.equals(udpPortB)); // ¼ì²éЭÒé¹ýÂË boolean protocolMatch = selectedProtocol.equals(allProtocols) || (localPort == UDPPortAReceiver.PORT && selectedProtocol.equals(udpProtocol)) || (localPort == UDPPortBReceiver.PORT && selectedProtocol.equals(udpProtocol)); // ¼ì²éÉ豸ID¹ýÂË boolean deviceIdMatch=false; if("1".equals(deviceId)) { deviceIdMatch=true; }else { deviceIdMatch = selectedDeviceId.equals(allDevices) || (deviceId != null && deviceId.equals(selectedDeviceId)); } // Ö»Óе±ËùÓÐÌõ¼þ¶¼Æ¥Åäʱ²ÅÏÔʾ if (!(dataTypeMatch && protocolMatch && deviceIdMatch)) { return; } // Éú³ÉºÁÃ뼶ʱ¼ä´Á SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS"); String timestamp = sdf.format(new Date()); String formattedData = formatData(rawData, ip, port, timestamp); if (isCapturing) { // Ìí¼ÓÔ¶³ÌÉ豸µ½ÏÂÀ­¿ò addRemoteDevice(ip, port, localPort); // ÔÚEDTÏß³ÌÖиüÐÂUI SwingUtilities.invokeLater(() -> { txtDataView.append(formattedData + "\n"); txtDataView.setCaretPosition(txtDataView.getDocument().getLength()); }); } // Èç¹ûÆôÓÃÁË×Ô¶¯±£´æ£¬Ôò±£´æµ½Îļþ if (chkAutoSave.isSelected()) { saveToFile(formattedData); } } // ¸ñʽ»¯Êý¾ÝÏÔʾ // Ð޸ĸñʽÏÔʾ·½·¨£¬Ö§³Ö»ìºÏ¸ñʽ private static String formatData(String rawData, String ip, int port, String timestamp) { StringBuilder formatted = new StringBuilder(); // ʹÓÃз½·¨»ñÈ¡µ±Ç°×ÊÔ´°ü ResourceBundle messages = Languages.getCurrentMessages(); // ÏÔʾÀ´Ô´ÐÅÏ¢ if (chkShowSource.isSelected()) { formatted.append("[") .append(timestamp) .append("][") .append(ip) .append(":") .append(port) .append("] "); } // ¸ù¾ÝÏÔʾѡÏî¸ñʽ»¯Êý¾Ý if (chkHexDisplay.isSelected() && chkAsciiDisplay.isSelected()) { formatted.append(formatHexString(rawData)) .append(" | ") .append(hexToAscii(rawData)) .append(" [") .append(messages.getString("MESSAGE_VIEW_MIXED_FORMAT")) .append("]"); } else if (chkHexDisplay.isSelected()) { formatted.append(formatHexString(rawData)) .append(" [") .append(messages.getString("MESSAGE_VIEW_HEX_FORMAT")) .append("]"); } else if (chkAsciiDisplay.isSelected()) { formatted.append(hexToAscii(rawData)) .append(" [") .append(messages.getString("MESSAGE_VIEW_ASCII_FORMAT")) .append("]"); } else { formatted.append(hexToAscii(rawData)); } return formatted.toString(); } // ÐÞ¸ÄÉ豸ID¼ÓÔØ·½·¨ private void loadDeviceIds() { cbDeviceId.removeAllItems(); cbDeviceId.addItem(messages.getString("MESSAGE_VIEW_ALL_DEVICES")); List tags = Dell_tag.getAlldeviceIds(); for (String tag : tags) { cbDeviceId.addItem(tag); } } // ½«×Ö·û´®×ª»»ÎªÊ®Áù½øÖƱíʾ private static String toHexString(String input) { StringBuilder hex = new StringBuilder(); // ʹÓÃStringBuilder¹¹½¨Ê®Áù½øÖÆ×Ö·û´® for (char c : input.toCharArray()) { // ±éÀúÿ¸ö×Ö·û hex.append(String.format("%02X ", (int) c)); // ¸ñʽ»¯ÎªÁ½Î»Ê®Áù½øÖÆ } return hex.toString().trim(); // ·µ»Ø²¢È¥³ýĩβ¿Õ¸ñ } // ¸ñʽ»¯Ê®Áù½øÖÆ×Ö·û´®£¨Ã¿Á½¸ö×Ö·û¼Ó¿Õ¸ñ£© private static String formatHexString(String hex) { StringBuilder formatted = new StringBuilder(); for (int i = 0; i < hex.length(); i += 2) { if (i > 0) formatted.append(" "); formatted.append(hex.substring(i, Math.min(i + 2, hex.length()))); } return formatted.toString(); } // ½«Ê®Áù½øÖÆ×Ö·û´®×ª»»ÎªASCII private static String hexToAscii(String hexStr) { StringBuilder output = new StringBuilder(); for (int i = 0; i < hexStr.length(); i += 2) { String str = hexStr.substring(i, i + 2); output.append((char) Integer.parseInt(str, 16)); } return output.toString(); } // ±£´æÊý¾Ýµ½Îļþ private static void saveToFile(String data) { SimpleDateFormat fileFormat = new SimpleDateFormat("yyyyMMdd"); // ÎļþÈÕÆÚ¸ñʽ String fileName = "systemfile/baowen/messages_" + fileFormat.format(new Date()) + ".txt"; // ÎļþÃû°üº¬ÈÕÆÚ try (java.io.FileWriter writer = new java.io.FileWriter(fileName, true)) { // ʹÓÃ×·¼Óģʽ writer.write(data + "\n"); // дÈëÊý¾Ý²¢»»ÐÐ } catch (java.io.IOException ex) { ex.printStackTrace(); // ´òÓ¡IOÒì³£ } } }