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<BatteryRecord> 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<BatteryRecord> getBatteryRecords(int offset, int limit) throws SQLException {
|
List<BatteryRecord> 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<BatteryRecord> 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<BatteryRecord> 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);
|
}
|
}
|
}
|
|
}
|