package dell_targets; import targets.LocationTag; import dell_targets.Dell_tag; import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.*; import java.util.List; import java.util.ResourceBundle; import publicsWay.ButtonUtils; // µ¼ÈëButtonUtils import publicsWay.TableUtils; // µ¼ÈëTableUtils public class SatelliteDevicePanel extends JPanel { private static final long serialVersionUID = 1L; private JTable deviceTable; private DefaultTableModel tableModel; private List allDevices; private ResourceBundle messages; private JTextField searchField; private JComboBox upgradeConditionCombo; private JTextField upgradeValueField; private JButton startUpgradeButton; private JTextField firmwareUrlField; // ¹Ì¼þÉý¼¶Îı¾Óò public static String FirmwareURL="";//¹Ì¼þÉý¼¶µØÖ· public static boolean isOpenUpgrade=false;//ÊÇ·ñ¿ªÆôÁËÉý¼¶¹¦ÄÜ public static List needUpgradeList=null;//ÐèÒªÉý¼¶µÄÉ豸¼¯ºÏ @SuppressWarnings("serial") public SatelliteDevicePanel(ResourceBundle messages) { this.messages = messages; setLayout(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Ìí¼Ó´°¿Ú¹Ø±Õ¼àÌýÆ÷ addWindowCloseListener(); // ¶¥²¿²Ù×÷Ãæ°å JPanel topPanel = new JPanel(new BorderLayout(5, 5)); topPanel.setBorder(BorderFactory.createTitledBorder(messages.getString("QUICK_OPERATION"))); // ËÑË÷Ãæ°å JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); JLabel searchLabel = new JLabel(messages.getString("DEVICE_NUMBER") + ":"); searchField = new JTextField(15); // ʹÓÃButtonUtils´´½¨À¶É«°´Å¥ JButton searchButton = ButtonUtils.createBlueButton(messages.getString("SEARCH")); JButton resetButton = ButtonUtils.createBlueButton(messages.getString("RESET")); JButton refreshButton = ButtonUtils.createBlueButton(messages.getString("REFRESH")); searchInputPanel.add(searchLabel); searchInputPanel.add(searchField); searchInputPanel.add(searchButton); searchInputPanel.add(resetButton); searchInputPanel.add(refreshButton); // Éý¼¶Ìõ¼þÃæ°å JPanel upgradePanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); upgradeConditionCombo = new JComboBox<>(new String[]{ messages.getString("SET_UPGRADE_CONDITIONS"), messages.getString("BY_VERSION"), messages.getString("BY_NUMBER"), messages.getString("BY_SELECTED_DEVICE"), messages.getString("BY_COMPANY_NAME") }); upgradeValueField = new JTextField(15); startUpgradeButton = ButtonUtils.createBlueButton(messages.getString("START_UPGRADE")); // ÐÂÔö¹Ì¼þµØÖ·Îı¾¿ò JLabel firmwareUrlLabel = new JLabel(messages.getString("FIRMWARE_URL") + ":"); firmwareUrlField = new JTextField(20); firmwareUrlField.setToolTipText(messages.getString("ENTER_FIRMWARE_DOWNLOAD_URL")); upgradePanel.add(upgradeConditionCombo); upgradePanel.add(upgradeValueField); upgradePanel.add(firmwareUrlLabel); upgradePanel.add(firmwareUrlField); upgradePanel.add(startUpgradeButton); // ²Ù×÷°´Å¥Ãæ°å JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0)); // ½«ËÑË÷Ãæ°å¡¢Éý¼¶Ãæ°åºÍ²Ù×÷Ãæ°å·ÅÔÚÒ»ÐÐ JPanel rowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5)); rowPanel.add(searchInputPanel); rowPanel.add(upgradePanel); rowPanel.add(actionPanel); topPanel.add(rowPanel, BorderLayout.CENTER); // ´´½¨±í¸ñÁÐÃû - Ôö¼ÓËùÊô¹«Ë¾ºÍÖ¸Áî·¢ËÍÁÐ String[] columnNames = { messages.getString("SELECT"), messages.getString("INDEX"), messages.getString("COMPANY"), // ÐÂÔöËùÊô¹«Ë¾ÁÐ messages.getString("DEVICE_NUMBER"), messages.getString("LONGITUDE"), messages.getString("LATITUDE"), messages.getString("ALTITUDE"), messages.getString("STATUS"), messages.getString("SATELLITE_COUNT"), messages.getString("DIFFERENTIAL_TIME"), messages.getString("RtkSource"), messages.getString("VERSION"), messages.getString("CARD_NUMBER"), messages.getString("ADDRESS"), messages.getString("PORT"), messages.getString("COMMAND_SEND"), // ÐÂÔöÖ¸Áî·¢ËÍÁÐ messages.getString("UPDATE_TIME") }; // ´´½¨±í¸ñÄ£ÐÍ tableModel = new DefaultTableModel(columnNames, 0) { @Override public boolean isCellEditable(int row, int column) { // Ö»ÓÐÑ¡ÔñÁкÍÖ¸Áî·¢ËÍÁпɱ༭ return column == 0 || column == 14; } @Override public Class getColumnClass(int columnIndex) { // Ñ¡ÔñÁÐʹÓÃBooleanÀàÐÍ if (columnIndex == 0) { return Boolean.class; } return Object.class; } }; // ´´½¨±í¸ñ - ʹÓÃTableUtilsÖеķ½·¨ deviceTable = new JTable(tableModel); TableUtils.setupTableStyle(deviceTable); TableUtils.setupTableHeaderStyle(deviceTable); deviceTable.setAutoCreateRowSorter(true); deviceTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); // ¸üÐÂÁпíÉèÖã¬Ôö¼Ó²î·ÖÔ´ÁеĿí¶È deviceTable.getColumnModel().getColumn(0).setPreferredWidth(50); deviceTable.getColumnModel().getColumn(1).setPreferredWidth(50); deviceTable.getColumnModel().getColumn(2).setPreferredWidth(100); deviceTable.getColumnModel().getColumn(3).setPreferredWidth(100); deviceTable.getColumnModel().getColumn(4).setPreferredWidth(80); deviceTable.getColumnModel().getColumn(5).setPreferredWidth(80); deviceTable.getColumnModel().getColumn(6).setPreferredWidth(80); deviceTable.getColumnModel().getColumn(7).setPreferredWidth(60); deviceTable.getColumnModel().getColumn(8).setPreferredWidth(80); deviceTable.getColumnModel().getColumn(9).setPreferredWidth(100); deviceTable.getColumnModel().getColumn(10).setPreferredWidth(100); // ²î·ÖÔ´Áпí¶È deviceTable.getColumnModel().getColumn(11).setPreferredWidth(80); deviceTable.getColumnModel().getColumn(12).setPreferredWidth(100); deviceTable.getColumnModel().getColumn(13).setPreferredWidth(120); deviceTable.getColumnModel().getColumn(14).setPreferredWidth(80); deviceTable.getColumnModel().getColumn(15).setPreferredWidth(100); deviceTable.getColumnModel().getColumn(16).setPreferredWidth(150); // Ó¦Óõ¥Ôª¸ñäÖȾÆ÷µ½ËùÓÐÁÐ - ʹÓÃTableUtilsÖеķ½·¨ DefaultTableCellRenderer cellRenderer = TableUtils.createCenteredCellRenderer(); for (int i = 0; i < deviceTable.getColumnCount(); i++) { deviceTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer); } // ÌØÊâ´¦ÀíÑ¡ÔñÁÐ(¸´Ñ¡¿ò) TableColumn selectColumn = deviceTable.getColumnModel().getColumn(0); selectColumn.setCellRenderer(new DefaultTableCellRenderer() { private JCheckBox checkBox = new JCheckBox(); @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof Boolean) { checkBox.setSelected((Boolean) value); } checkBox.setHorizontalAlignment(SwingConstants.CENTER); // ÉèÖý»ÌæÐÐÑÕÉ« if (!isSelected) { if (row % 2 == 0) { checkBox.setBackground(new Color(240, 240, 200)); // µ­»ÆÉ« } else { checkBox.setBackground(Color.WHITE); // °×É« } } else { checkBox.setBackground(new Color(200, 220, 240)); // Ñ¡ÖÐÐеÄÀ¶É« } checkBox.setOpaque(true); return checkBox; } }); JScrollPane scrollPane = new JScrollPane(deviceTable); scrollPane.setPreferredSize(new Dimension(1200, 400)); scrollPane.setBorder(BorderFactory.createEmptyBorder()); // ÒÆ³ý¹ö¶¯Ãæ°å±ß¿ò // Ìí¼Ó×é¼þ add(topPanel, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); // ¼ÓÔØÊý¾Ý loadDeviceData(); // Ìí¼Óʼþ¼àÌýÆ÷ searchButton.addActionListener(e -> searchDevices()); resetButton.addActionListener(e -> resetSearch()); refreshButton.addActionListener(e -> loadDeviceData()); startUpgradeButton.addActionListener(e -> startUpgrade()); // Ìí¼Ó±í¸ñÄ£ÐͼàÌýÆ÷£¬ÓÃÓÚ×Ô¶¯¸üÐÂÑ¡ÖÐÉ豸µ½Îı¾¿ò tableModel.addTableModelListener(e -> { if (e.getColumn() == 0 && messages.getString("BY_SELECTED_DEVICE").equals(upgradeConditionCombo.getSelectedItem())) { updateSelectedDevicesToTextField(); } }); // Ìí¼ÓÉý¼¶Ìõ¼þ×éºÏ¿ò¼àÌýÆ÷ upgradeConditionCombo.addActionListener(e -> { if (messages.getString("BY_SELECTED_DEVICE").equals(upgradeConditionCombo.getSelectedItem())) { updateSelectedDevicesToTextField(); } }); } // ¸üÐÂÑ¡ÖÐÉ豸µ½Îı¾¿ò private void updateSelectedDevicesToTextField() { List selectedDevices = new ArrayList<>(); for (int i = 0; i < tableModel.getRowCount(); i++) { Boolean isSelected = (Boolean) tableModel.getValueAt(i, 0); if (isSelected != null && isSelected) { String deviceNumber = (String) tableModel.getValueAt(i, 3); // É豸±àºÅÔÚµÚ3ÁÐ selectedDevices.add(deviceNumber); } } upgradeValueField.setText(String.join(",", selectedDevices)); } // °´Å¥äÖȾÆ÷ class ButtonRenderer extends JButton implements TableCellRenderer { private static final long serialVersionUID = 1L; public ButtonRenderer() { setOpaque(true); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setText((value == null) ? "" : value.toString()); return this; } } // °´Å¥±à¼­Æ÷ class ButtonEditor extends DefaultCellEditor { private static final long serialVersionUID = 1L; private String label; private JButton button; public ButtonEditor(JCheckBox checkBox) { super(checkBox); button = new JButton(); button.setOpaque(true); button.addActionListener(e -> fireEditingStopped()); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { label = (value == null) ? "" : value.toString(); button.setText(label); return button; } @Override public Object getCellEditorValue() { return label; } } private void loadDeviceData() { try { allDevices = Dell_tag.getOnlineLocationTags(); updateTable(allDevices); } catch (Exception ex) { JOptionPane.showMessageDialog(this, messages.getString("DATA_LOAD_ERROR") + ": " + ex.getMessage(), messages.getString("ERROR"), JOptionPane.ERROR_MESSAGE); } } // ËÑË÷É豸 private void searchDevices() { String keyword = searchField.getText().trim(); if (keyword.isEmpty()) { updateTable(allDevices); return; } List filtered = new ArrayList<>(); for (LocationTag device : allDevices) { if (device.getDeviceNumber() != null && device.getDeviceNumber().toLowerCase().contains(keyword.toLowerCase())) { filtered.add(device); } } if (filtered.isEmpty()) { JOptionPane.showMessageDialog(this, messages.getString("SEARCH_NO_RESULTS"), messages.getString("INFO"), JOptionPane.INFORMATION_MESSAGE); } updateTable(filtered); } // ÖØÖÃËÑË÷ private void resetSearch() { searchField.setText(""); updateTable(allDevices); } private void updateTable(List devices) { tableModel.setRowCount(0); int index = 1; for (LocationTag device : devices) { tableModel.addRow(new Object[]{ false, // Ñ¡ÔñÁÐ index++, device.getCompany(), // ÐÂÔö¹«Ë¾ÁÐ device.getDeviceNumber(), device.getLongitude(), device.getLatitude(), device.getAltitude(), device.getSatelliteQuality(), device.getSatelliteCount(), device.getDifferentialTime(), device.getRTKsource(), // ÐÂÔö²î·ÖÔ´Êý¾Ý device.getDeviceVersion(), device.getDeviceCardNumber(), device.getIpAddress(), device.getIpPort(), device.getAutoUpgraded(),// Ö¸Áî·¢ËͰ´Å¥ device.getGnGgaDataTime() }); } } // Æô¶¯Éý¼¶ private void startUpgrade() { int dex = upgradeConditionCombo.getSelectedIndex(); String value = upgradeValueField.getText().trim(); String firmwareUrl = firmwareUrlField.getText().trim(); if (firmwareUrl.isEmpty()) { JOptionPane.showMessageDialog(this, messages.getString("FIRMWARE_URL_REQUIRED"), messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); return; } if (value.isEmpty()) { JOptionPane.showMessageDialog(this, messages.getString("UPGRADE_VALUE_REQUIRED"), messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); return; } List devicesToUpgrade = new ArrayList<>(); // ¸ù¾ÝÌõ¼þÖ´ÐÐÉý¼¶Âß¼­ if (dex == 3) { // »ñȡѡÖеÄÉ豸 for (int i = 0; i < tableModel.getRowCount(); i++) { Boolean isSelected = (Boolean) tableModel.getValueAt(i, 0); if (isSelected != null && isSelected) { String deviceNumber = (String) tableModel.getValueAt(i, 3); LocationTag device = Dell_tag.getTagByDeviceId(deviceNumber); if (device != null) { devicesToUpgrade.add(device); } } } if (devicesToUpgrade.isEmpty()) { JOptionPane.showMessageDialog(this, messages.getString("SELECT_DEVICE_TO_UPGRADE"), messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); return; } } else if (dex == 1) { // Ö´Ðа´°æ±¾Éý¼¶ devicesToUpgrade = Dell_tag.getLocationTagsByProperty("deviceVersion", value); } else if (dex == 2) { // Ö´Ðа´É豸±àºÅÉý¼¶ - ÐÞ¸´Âß¼­´íÎó String[] tagIds = value.split("[\\s,;]+"); // ʹÓÃÕýÔò±í´ïʽ·Ö¸î¶àÖÖ·Ö¸ô·û for (String tagId : tagIds) { List devicesForId = Dell_tag.getLocationTagsByProperty("deviceNumber", tagId.trim()); if (devicesForId != null) { devicesToUpgrade.addAll(devicesForId); } } } else if (dex == 4) { // Ö´Ðа´¹«Ë¾Ãû³ÆÉý¼¶ devicesToUpgrade = Dell_tag.getLocationTagsByProperty("company", value); } // ÑéÖ¤ÊÇ·ñÓÐÉ豸ÐèÒªÉý¼¶ if (devicesToUpgrade.isEmpty()) { JOptionPane.showMessageDialog(this, messages.getString("NO_DEVICES_TO_UPGRADE"), messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE); return; } FirmwareURL = firmwareUrl; // ¹Ì¼þÉý¼¶µØÖ· isOpenUpgrade = true; // ÊÇ·ñ¿ªÆôÁËÉý¼¶¹¦ÄÜ needUpgradeList = devicesToUpgrade; // ÐèÒªÉý¼¶µÄÉ豸¼¯ºÏ // Ö´ÐÐÉý¼¶ performUpgrade(devicesToUpgrade, firmwareUrl); } private void performUpgrade(List devices, String firmwareUrl) { // ¹¹½¨É豸±àºÅÁбí×Ö·û´® StringBuilder deviceListBuilder = new StringBuilder(); int maxDisplay = 20; int displayCount = Math.min(devices.size(), maxDisplay); for (int i = 0; i < displayCount; i++) { if (i > 0) { deviceListBuilder.append(", "); } deviceListBuilder.append(devices.get(i).getDeviceNumber()); } if (devices.size() > maxDisplay) { deviceListBuilder.append(messages.getString("UPGRADE_DEVICE_ELLIPSIS")) .append(devices.size()) .append(messages.getString("UPGRADE_DEVICE_UNIT")); } // ´´½¨°üº¬É豸ÁбíºÍ¹Ì¼þµØÖ·µÄÍêÕûÏûÏ¢ String message = messages.getString("UPGRADE_CONFIRMATION_HEADER") + deviceListBuilder.toString() + "\n\n" + messages.getString("FIRMWARE_URL_LABEL") + ": " + firmwareUrl + "\n\n" + String.format(messages.getString("TOTAL_DEVICES_COUNT"), devices.size()); JOptionPane.showMessageDialog(this, message, messages.getString("INFO"), JOptionPane.INFORMATION_MESSAGE); } // Ìí¼Ó´°¿Ú¹Ø±Õ¼àÌýÆ÷ private void addWindowCloseListener() { // »ñÈ¡¶¥²ã´°¿Ú Window window = SwingUtilities.getWindowAncestor(this); if (window != null) { window.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { isOpenUpgrade = false; } @Override public void windowClosed(WindowEvent e) { isOpenUpgrade = false; } }); } } public static String getFirmwareURL() { return FirmwareURL; } public static boolean isOpenUpgrade() { return isOpenUpgrade; } public static List getNeedUpgradeList() { return needUpgradeList; } }