package dell_targets;
|
|
import targets.LocationTag;
|
import javax.swing.*;
|
import javax.swing.table.DefaultTableCellRenderer;
|
import javax.swing.table.DefaultTableModel;
|
import javax.swing.table.JTableHeader;
|
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;
|
import publicsWay.ButtonUtils; // Added import
|
|
public class TagManagementPanel extends JPanel {
|
private static final long serialVersionUID = 1L;
|
private JTable tagTable;
|
private DefaultTableModel tableModel;
|
private JTextField searchField;
|
private List<LocationTag> allTags;
|
private ResourceBundle messages;
|
|
public TagManagementPanel(ResourceBundle messages) {
|
this.messages = messages;
|
setLayout(new BorderLayout());
|
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
|
|
// ´´½¨¶¥²¿Ãæ°å
|
JPanel topPanel = new JPanel(new BorderLayout(5, 5));
|
topPanel.setBorder(BorderFactory.createTitledBorder(messages.getString("SEARCH")));
|
|
// ×ó²àËÑË÷×é¼þÃæ°å
|
JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
|
JLabel searchLabel = new JLabel(messages.getString("DEVICE_NUMBER") + ":");
|
searchField = new JTextField(20);
|
|
// ʹÓÃButtonUtils´´½¨°´Å¥
|
JButton searchButton = ButtonUtils.createBlueButton(messages.getString("SEARCH"));
|
JButton resetButton = ButtonUtils.createBlueButton(messages.getString("RESET"));
|
|
searchInputPanel.add(searchLabel);
|
searchInputPanel.add(searchField);
|
searchInputPanel.add(searchButton);
|
searchInputPanel.add(resetButton);
|
|
// ÓÒ²à²Ù×÷°´Å¥Ãæ°å
|
JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0));
|
JButton addButton = ButtonUtils.createBlueButton(messages.getString("ADD"));
|
JButton deleteButton = ButtonUtils.createBlueButton(messages.getString("DELETE"));
|
JButton refreshButton = ButtonUtils.createBlueButton(messages.getString("REFRESH"));
|
|
actionPanel.add(addButton);
|
actionPanel.add(deleteButton);
|
actionPanel.add(refreshButton);
|
|
// ½«×ó²àËÑË÷ºÍÓÒ²à²Ù×÷Ìí¼Óµ½¶¥²¿Ãæ°å
|
topPanel.add(searchInputPanel, BorderLayout.CENTER);
|
topPanel.add(actionPanel, BorderLayout.EAST);
|
|
// ´´½¨±í¸ñ - °´ÕÕ±í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.setShowVerticalLines(false); // ²»ÏÔʾÊúÏß
|
tagTable.setShowHorizontalLines(true); // ÏÔʾºáÏß
|
tagTable.setGridColor(new Color(220, 220, 220)); // ÉèÖÃÍø¸ñÏßÑÕɫΪdz»ÒÉ«
|
tagTable.setIntercellSpacing(new Dimension(0, 1)); // ÉèÖõ¥Ôª¸ñ¼ä¾à£¬Ôö¼ÓÐмä¾à
|
tagTable.setRowHeight(25); // ÉèÖÃÐиß
|
|
// ÉèÖÃÁпí
|
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);
|
|
// ÉèÖñíÍ·Ñùʽ
|
JTableHeader header = tagTable.getTableHeader();
|
header.setBackground(new Color(70, 130, 180)); // ¸ÖÀ¶É«±íÍ·
|
header.setForeground(Color.WHITE);
|
header.setFont(header.getFont().deriveFont(Font.BOLD));
|
header.setPreferredSize(new Dimension(header.getWidth(), 30)); // Ôö¼Ó±íÍ·¸ß¶È
|
|
// ´´½¨±íÍ·äÖȾÆ÷
|
DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer() {
|
/**
|
*
|
*/
|
private static final long serialVersionUID = 1L;
|
|
{
|
setHorizontalAlignment(SwingConstants.CENTER);
|
setBackground(new Color(70, 130, 180)); // ¸ÖÀ¶É«±íÍ·
|
setForeground(Color.WHITE);
|
setFont(getFont().deriveFont(Font.BOLD));
|
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // Ôö¼Ó±íÍ·Äڱ߾à
|
}
|
};
|
|
// Ó¦ÓñíÍ·äÖȾÆ÷
|
for (int i = 0; i < tagTable.getColumnCount(); i++) {
|
tagTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer);
|
}
|
|
// ´´½¨µ¥Ôª¸ñäÖȾÆ÷£¬ÊµÏÖÕ¤À¸Ð§¹û
|
DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer() {
|
/**
|
*
|
*/
|
private static final long serialVersionUID = 1L;
|
|
@Override
|
public Component getTableCellRendererComponent(JTable table, Object value,
|
boolean isSelected, boolean hasFocus,
|
int row, int column) {
|
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
|
// ÉèÖý»ÌæÐÐÑÕÉ«
|
if (!isSelected) {
|
if (row % 2 == 0) {
|
c.setBackground(new Color(240, 240, 200)); // dz»ÒÉ«
|
} else {
|
c.setBackground(Color.WHITE); // °×É«
|
}
|
} else {
|
c.setBackground(new Color(200, 220, 240)); // Ñ¡ÖÐÐеÄÀ¶É«
|
}
|
|
// ÉèÖõ¥Ôª¸ñ¶ÔÆë·½Ê½
|
if (column == 0) { // Ë÷ÒýÁоÓÖÐ
|
setHorizontalAlignment(SwingConstants.CENTER);
|
} else if (column == 5) { // µç³ØµçÁ¿ÁоÓÖÐ
|
setHorizontalAlignment(SwingConstants.CENTER);
|
} else {
|
setHorizontalAlignment(SwingConstants.CENTER);
|
}
|
|
// ÉèÖõ¥Ôª¸ñ±ß¿ò
|
setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); // ×óÓÒÄڱ߾à
|
|
return c;
|
}
|
};
|
|
// Ó¦Óõ¥Ôª¸ñäÖȾÆ÷µ½ËùÓÐÁÐ
|
for (int i = 0; i < tagTable.getColumnCount(); i++) {
|
tagTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer);
|
}
|
|
JScrollPane scrollPane = new JScrollPane(tagTable);
|
scrollPane.setPreferredSize(new Dimension(1200, 400));
|
scrollPane.setBorder(BorderFactory.createEmptyBorder()); // ÒÆ³ý¹ö¶¯Ãæ°å±ß¿ò
|
|
// Ìí¼Ó×é¼þ
|
add(topPanel, BorderLayout.NORTH);
|
add(scrollPane, BorderLayout.CENTER);
|
|
// ¼ÓÔØÊý¾Ý
|
loadTagData();
|
|
// Ìí¼Óʼþ¼àÌýÆ÷
|
searchButton.addActionListener(new SearchAction());
|
resetButton.addActionListener(e -> resetSearch());
|
refreshButton.addActionListener(e -> loadTagData());
|
|
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<LocationTag> 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 void resetSearch() {
|
searchField.setText("");
|
updateTable(allTags);
|
}
|
|
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<LocationTag> 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));
|
}
|
}
|
}
|