package dell_targets; import targets.LocationTag; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.SQLException; import java.util.List; import java.util.ResourceBundle; public class TagManagementPanel extends JPanel { private static final long serialVersionUID = 1L; private JTable tagTable; private DefaultTableModel tableModel; private JTextField searchField; private List allTags; private ResourceBundle messages; public TagManagementPanel(ResourceBundle messages) { this.messages = messages; setLayout(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); // ´´½¨ËÑË÷Ãæ°å JPanel searchPanel = new JPanel(new BorderLayout(5, 5)); searchPanel.setBorder(BorderFactory.createTitledBorder(messages.getString("SEARCH"))); // ´´½¨ËÑË÷Îı¾¿òºÍ°´Å¥ searchField = new JTextField(10); // Ëõ¶ÌËÑË÷Îı¾¿ò³¤¶È JButton searchButton = new JButton(messages.getString("SEARCH")); JButton refreshButton = new JButton(messages.getString("REFRESH")); // Ìí¼Óˢа´Å¥ refreshButton.addActionListener(e -> loadTagData()); // °ó¶¨Ë¢Ð¶¯×÷ JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5)); buttonPanel.add(searchButton); buttonPanel.add(refreshButton); searchPanel.add(searchField, BorderLayout.CENTER); searchPanel.add(buttonPanel, BorderLayout.EAST); // ´´½¨²Ù×÷°´Å¥Ãæ°å JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5)); JButton addButton = new JButton(messages.getString("ADD")); JButton deleteButton = new JButton(messages.getString("DELETE")); actionPanel.add(addButton); actionPanel.add(deleteButton); // ´´½¨±í¸ñ - °´ÕÕ±í5ÒªÇóÐÞ¸ÄÁÐÃû String[] columnNames = { messages.getString("INDEX"), messages.getString("DEVICE_NUMBER"), messages.getString("DEVICE_NAME"), messages.getString("ONLINE_STATUS"), messages.getString("DEVICE_TYPE"), messages.getString("BATTERY_LEVEL"), messages.getString("CARD_NUMBER"), // ¿¨ºÅ messages.getString("ADDRESS_PORT"), // µØÖ·¶Ë¿Ú messages.getString("DEVICE_VERSION"), messages.getString("ONLINE_TIME"), // ÉÏÏßʱ¼ä messages.getString("COMPANY") }; tableModel = new DefaultTableModel(columnNames, 0) { private static final long serialVersionUID = 1L; @Override public boolean isCellEditable(int row, int column) { return false; } }; tagTable = new JTable(tableModel); tagTable.setAutoCreateRowSorter(true); tagTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // ÉèÖÃÁпí tagTable.getColumnModel().getColumn(0).setPreferredWidth(30); tagTable.getColumnModel().getColumn(1).setPreferredWidth(100); tagTable.getColumnModel().getColumn(2).setPreferredWidth(100); tagTable.getColumnModel().getColumn(3).setPreferredWidth(70); tagTable.getColumnModel().getColumn(4).setPreferredWidth(70); tagTable.getColumnModel().getColumn(5).setPreferredWidth(70); tagTable.getColumnModel().getColumn(6).setPreferredWidth(100); // ¿¨ºÅ tagTable.getColumnModel().getColumn(7).setPreferredWidth(100); // µØÖ·¶Ë¿Ú tagTable.getColumnModel().getColumn(8).setPreferredWidth(70); tagTable.getColumnModel().getColumn(9).setPreferredWidth(120); // ÉÏÏßʱ¼ä tagTable.getColumnModel().getColumn(10).setPreferredWidth(100); JScrollPane scrollPane = new JScrollPane(tagTable); scrollPane.setPreferredSize(new Dimension(1200, 400)); // Ìí¼Ó×é¼þ add(searchPanel, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); add(actionPanel, BorderLayout.SOUTH); // ¼ÓÔØÊý¾Ý loadTagData(); // Ìí¼Óʼþ¼àÌýÆ÷ searchButton.addActionListener(new SearchAction()); addButton.addActionListener(e -> { AddTagDialog dialog = new AddTagDialog((Frame) SwingUtilities.getWindowAncestor(TagManagementPanel.this), messages); dialog.setVisible(true); if (dialog.isConfirmed()) { try { Dell_tag.insertLocationTag(dialog.getTag()); loadTagData(); JOptionPane.showMessageDialog(TagManagementPanel.this, messages.getString("SAVE_SUCCESS"), messages.getString("SUCCESS"), JOptionPane.INFORMATION_MESSAGE); } catch (SQLException ex) { JOptionPane.showMessageDialog(TagManagementPanel.this, messages.getString("SAVE_FAILED") + ": " + ex.getMessage(), messages.getString("ERROR"), JOptionPane.ERROR_MESSAGE); } } }); deleteButton.addActionListener(e -> { int selectedRow = tagTable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(TagManagementPanel.this, messages.getString("SELECT_TAG_TO_DELETE"), messages.getString("INFO"), JOptionPane.INFORMATION_MESSAGE); return; } String deviceId = (String) tableModel.getValueAt(selectedRow, 1); int confirm = JOptionPane.showConfirmDialog(TagManagementPanel.this, messages.getString("CONFIRM_DELETE") + " [" + deviceId + "]?", messages.getString("CONFIRM_DELETE_TITLE"), JOptionPane.YES_NO_OPTION); if (confirm == JOptionPane.YES_OPTION) { try { Dell_tag.deleteLocationTag(deviceId); loadTagData(); JOptionPane.showMessageDialog(TagManagementPanel.this, messages.getString("DELETE_SUCCESS"), messages.getString("SUCCESS"), JOptionPane.INFORMATION_MESSAGE); } catch (SQLException ex) { JOptionPane.showMessageDialog(TagManagementPanel.this, messages.getString("DELETE_FAILED") + ": " + ex.getMessage(), messages.getString("ERROR"), JOptionPane.ERROR_MESSAGE); } } }); } private void loadTagData() { try { // ¼ÓÔØÊý¾Ý allTags = Dell_tag.getlocationTags(); updateTable(allTags); } catch (SQLException ex) { JOptionPane.showMessageDialog(this, messages.getString("DATA_LOAD_ERROR") + ": " + ex.getMessage(), messages.getString("ERROR"), JOptionPane.ERROR_MESSAGE); } } private void updateTable(List tags) { tableModel.setRowCount(0); // Çå¿Õ±í¸ñ int index = 1; for (LocationTag tag : tags) { // ת»»ÔÚÏß״̬ String onlineStatus = "1".equals(tag.getOnlineStatus()) ? messages.getString("ONLINE") : messages.getString("OFFLINE"); // Ìí¼ÓÐÐ - °´ÕÕ±í5ÒªÇóÐÞ¸ÄÊý¾ÝÔ´ tableModel.addRow(new Object[]{ index++, tag.getDeviceNumber(), tag.getDeviceName(), onlineStatus, tag.getDeviceType(), tag.getDeviceBattery() + "%", tag.getDeviceCardNumber(), // ¿¨ºÅ tag.getIpAndPort(), // µØÖ·¶Ë¿Ú tag.getDeviceVersion(), tag.getOnlineTime(), // ÉÏÏßʱ¼ä tag.getCompany() }); } } private class SearchAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String keyword = searchField.getText().trim(); if (keyword.isEmpty()) { updateTable(allTags); // ÏÔʾËùÓÐÊý¾Ý return; } // ËÑË÷ÄÚÈݹ¦ÄÜ - Ôö¼Ó¹«Ë¾ËÑË÷ java.util.List filteredTags = new java.util.ArrayList<>(); for (LocationTag tag : allTags) { if (matchesKeyword(tag, keyword)) { filteredTags.add(tag); } } updateTable(filteredTags); } private boolean matchesKeyword(LocationTag tag, String keyword) { // ËÑË÷É豸±àºÅ¡¢É豸Ãû³ÆºÍ¹«Ë¾ return (tag.getDeviceNumber() != null && tag.getDeviceNumber().contains(keyword)) || (tag.getDeviceName() != null && tag.getDeviceName().contains(keyword)) || (tag.getCompany() != null && tag.getCompany().contains(keyword)); } } }