package dell_targets; import databases.DBConnector; import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; public class BatteryRecordPanel extends JPanel { private static final long serialVersionUID = 1L; private JTable recordTable; private DefaultTableModel tableModel; private JTextField searchField; private List allRecords; private ResourceBundle messages; private JButton prevButton, nextButton; private int currentPage = 1; private int pageSize = 100; private int totalPages = 1; public BatteryRecordPanel(ResourceBundle messages) { this.messages = messages; setLayout(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // ´´½¨ËÑË÷Ãæ°å JPanel searchPanel = new JPanel(new BorderLayout(5, 5)); searchPanel.setBorder(BorderFactory.createTitledBorder(getMessage("SEARCH"))); // ´´½¨ËÑË÷Îı¾¿òºÍ°´Å¥ searchField = new JTextField(10); JButton searchButton = new JButton(getMessage("SEARCH")); JButton refreshButton = new JButton(getMessage("REFRESH")); refreshButton.addActionListener(e -> loadBatteryData()); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5)); buttonPanel.add(searchButton); buttonPanel.add(refreshButton); // ÉèÖÃËÑË÷¿ò¸ß¶ÈÓë°´Å¥Ò»Ö Dimension buttonSize = refreshButton.getPreferredSize(); searchField.setPreferredSize(new Dimension(searchField.getPreferredSize().width, buttonSize.height)); searchPanel.add(searchField, BorderLayout.CENTER); searchPanel.add(buttonPanel, BorderLayout.EAST); // ´´½¨±í¸ñÁÐÃû String[] columnNames = { getMessage("INDEX"), getMessage("DEVICE_NUMBER"), getMessage("BATTERY_LEVEL"), getMessage("SAVE_TIME"), getMessage("COMPANY") }; // ´´½¨±í¸ñÄ£ÐÍ tableModel = new DefaultTableModel(columnNames, 0) { /** * */ private static final long serialVersionUID = 1L; @Override public boolean isCellEditable(int row, int column) { return false; // ËùÓе¥Ôª¸ñ²»¿É±à¼­ } }; // ´´½¨±í¸ñ recordTable = new JTable(tableModel); recordTable.setAutoCreateRowSorter(true); recordTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // ÉèÖÃÁпí recordTable.getColumnModel().getColumn(0).setPreferredWidth(30); // ÐòºÅÁÐ recordTable.getColumnModel().getColumn(1).setPreferredWidth(100); recordTable.getColumnModel().getColumn(2).setPreferredWidth(80); recordTable.getColumnModel().getColumn(3).setPreferredWidth(150); recordTable.getColumnModel().getColumn(4).setPreferredWidth(100); // ÉèÖñíÍ·Ñùʽ£º»ÒÉ«±³¾° + ¼Ó´Ö×ÖÌå JTableHeader header = recordTable.getTableHeader(); header.setBackground(Color.GRAY); header.setForeground(Color.WHITE); header.setFont(header.getFont().deriveFont(Font.BOLD)); // ÉèÖñíÍ·×ó¶ÔÆë header.setDefaultRenderer(new DefaultTableCellRenderer() { /** * */ private static final long serialVersionUID = 1L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); setHorizontalAlignment(SwingConstants.LEFT); setBackground(Color.GRAY); setForeground(Color.WHITE); setFont(getFont().deriveFont(Font.BOLD)); return this; } }); JScrollPane scrollPane = new JScrollPane(recordTable); scrollPane.setPreferredSize(new Dimension(800, 450)); // ´´½¨·ÖÒ³¿ØÖÆÃæ°å JPanel paginationPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 5)); prevButton = new JButton(getMessage("PREV_PAGE")); nextButton = new JButton(getMessage("NEXT_PAGE")); JLabel pageLabel = new JLabel(); prevButton.addActionListener(e -> { if (currentPage > 1) { currentPage--; updatePageLabel(pageLabel); loadBatteryData(); } }); nextButton.addActionListener(e -> { if (currentPage < totalPages) { currentPage++; updatePageLabel(pageLabel); loadBatteryData(); } }); updatePageLabel(pageLabel); paginationPanel.add(prevButton); paginationPanel.add(pageLabel); paginationPanel.add(nextButton); // Ìí¼Ó×é¼þ add(searchPanel, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); add(paginationPanel, BorderLayout.SOUTH); // ¼ÓÔØÊý¾Ý loadBatteryData(); // Ìí¼ÓËÑË÷¹¦ÄÜ searchButton.addActionListener(new SearchAction()); } private void updatePageLabel(JLabel label) { label.setText(getMessage("PAGE") + " " + currentPage + " / " + totalPages); } private void loadBatteryData() { try { // ¼ÆËãÆ«ÒÆÁ¿ int offset = (currentPage - 1) * pageSize; // »ñÈ¡×ܼǼÊý int totalRecords = getTotalRecordCount(); totalPages = (int) Math.ceil((double) totalRecords / pageSize); if (totalPages == 0) totalPages = 1; // »ñÈ¡µ±Ç°Ò³Êý¾Ý allRecords = getBatteryRecords(offset, pageSize); updateTable(allRecords); // ¸üзÖÒ³°´Å¥×´Ì¬ prevButton.setEnabled(currentPage > 1); nextButton.setEnabled(currentPage < totalPages); } catch (SQLException ex) { JOptionPane.showMessageDialog(this, getMessage("DATA_LOAD_ERROR") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); } } private int getTotalRecordCount() throws SQLException { String countQuery = "SELECT COUNT(*) AS total FROM battery_record"; try (ResultSet rs = DBConnector.executeQuery(countQuery)) { if (rs.next()) { return rs.getInt("total"); } } return 0; } private List getBatteryRecords(int offset, int limit) throws SQLException { List records = new ArrayList<>(); String query = "SELECT * FROM battery_record ORDER BY save_time DESC LIMIT " + limit + " OFFSET " + offset; try (ResultSet rs = DBConnector.executeQuery(query)) { while (rs.next()) { BatteryRecord record = new BatteryRecord(); record.setId(rs.getLong("id")); record.setDeviceNumber(rs.getString("device_number")); record.setBatteryLevel(rs.getString("battery_level")); record.setSaveTime(rs.getString("save_time")); record.setCompany(rs.getString("company")); records.add(record); } } return records; } private void updateTable(List records) { tableModel.setRowCount(0); // Çå¿Õ±í¸ñ int startIndex = (currentPage - 1) * pageSize + 1; for (BatteryRecord record : records) { tableModel.addRow(new Object[]{ startIndex++, record.getDeviceNumber(), record.getBatteryLevel() + "%", record.getSaveTime(), record.getCompany() }); } } private String getMessage(String key) { try { return messages.getString(key); } catch (Exception e) { // ΪȱʧµÄ¼üÌṩĬÈÏÖµ switch(key) { case "SEARCH": return "ËÑË÷"; case "REFRESH": return "Ë¢ÐÂ"; case "INDEX": return "ÐòºÅ"; case "DEVICE_NUMBER": return "É豸±àºÅ"; case "BATTERY_LEVEL": return "µçÁ¿"; case "SAVE_TIME": return "±£´æÊ±¼ä"; case "COMPANY": return "¹«Ë¾"; case "PREV_PAGE": return "ÉÏÒ»Ò³"; case "NEXT_PAGE": return "ÏÂÒ»Ò³"; case "PAGE": return "Ò³Âë"; case "DATA_LOAD_ERROR": return "Êý¾Ý¼ÓÔØÊ§°Ü"; case "SEARCH_ERROR": return "ËÑË÷ʧ°Ü"; case "ERROR": return "´íÎó"; default: return "[" + key + "]"; } } } // ÄÚ²¿Àà±íʾµç³Ø¼Ç¼ private static class BatteryRecord { private long id; private String deviceNumber; private String batteryLevel; private String saveTime; private String company; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getDeviceNumber() { return deviceNumber; } public void setDeviceNumber(String deviceNumber) { this.deviceNumber = deviceNumber; } public String getBatteryLevel() { return batteryLevel; } public void setBatteryLevel(String batteryLevel) { this.batteryLevel = batteryLevel; } public String getSaveTime() { return saveTime; } public void setSaveTime(String saveTime) { this.saveTime = saveTime; } public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } } private class SearchAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String keyword = searchField.getText().trim(); if (keyword.isEmpty()) { currentPage = 1; loadBatteryData(); return; } // ʹÓà PreparedStatement °²È«Ö´Ðдø²ÎÊýµÄ²éѯ String searchQuery = "SELECT * FROM battery_record " + "WHERE device_number LIKE ? OR save_time LIKE ? OR company LIKE ? " + "ORDER BY save_time DESC"; List filteredRecords = new ArrayList<>(); try (Connection conn = DBConnector.connectToDatabase(); PreparedStatement pstmt = conn.prepareStatement(searchQuery)) { // ÉèÖòéѯ²ÎÊý pstmt.setString(1, "%" + keyword + "%"); pstmt.setString(2, "%" + keyword + "%"); pstmt.setString(3, "%" + keyword + "%"); try (ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { BatteryRecord record = new BatteryRecord(); record.setId(rs.getLong("id")); record.setDeviceNumber(rs.getString("device_number")); record.setBatteryLevel(rs.getString("battery_level")); record.setSaveTime(rs.getString("save_time")); record.setCompany(rs.getString("company")); filteredRecords.add(record); } } allRecords = filteredRecords; updateTable(allRecords); // ÖØÖ÷ÖÒ³ currentPage = 1; totalPages = 1; prevButton.setEnabled(false); nextButton.setEnabled(false); } catch (SQLException ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(BatteryRecordPanel.this, getMessage("SEARCH_ERROR") + ": " + ex.getMessage(), getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); } catch (NullPointerException npe) { npe.printStackTrace(); JOptionPane.showMessageDialog(BatteryRecordPanel.this, getMessage("SEARCH_ERROR") + ": Êý¾Ý¿âÁ¬½Óʧ°Ü", getMessage("ERROR"), JOptionPane.ERROR_MESSAGE); } } } }