package dell_suanfa;
|
import targets.LayerManagement;
|
import javax.swing.*;
|
import javax.swing.border.EmptyBorder;
|
import javax.swing.table.*;
|
|
import dell_system.Dell_company;
|
|
import java.awt.*;
|
import java.sql.SQLException;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
import java.util.List;
|
import java.util.ResourceBundle;
|
|
public class LayerManagementPanel extends JPanel {
|
private static final long serialVersionUID = 1L;
|
private JTable layerTable;
|
private DefaultTableModel tableModel;
|
private List<LayerManagement> allLayers;
|
private ResourceBundle messages;
|
private JTextField searchField;
|
@SuppressWarnings("serial")
|
public LayerManagementPanel(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(getMessage("FLOOR_SETTINGS")));
|
|
// ×ó²àËÑË÷Ãæ°å
|
JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
|
JLabel searchLabel = new JLabel(getMessage("SEARCH") + ":");
|
searchField = new JTextField(20);
|
JButton searchButton = new JButton(getMessage("SEARCH"));
|
JButton resetButton = new JButton(getMessage("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 = new JButton(getMessage("ADD"));
|
JButton editButton = new JButton(getMessage("EDIT"));
|
JButton deleteButton = new JButton(getMessage("DELETE"));
|
JButton refreshButton = new JButton(getMessage("REFRESH"));
|
|
actionPanel.add(addButton);
|
actionPanel.add(editButton);
|
actionPanel.add(deleteButton);
|
actionPanel.add(refreshButton);
|
|
// Ìí¼ÓËÑË÷ºÍ²Ù×÷Ãæ°åµ½¶¥²¿Ãæ°å
|
topPanel.add(searchInputPanel, BorderLayout.CENTER);
|
topPanel.add(actionPanel, BorderLayout.EAST);
|
|
// ´´½¨±í¸ñÁÐÃû
|
String[] columnNames = {
|
getMessage("INDEX"),
|
getMessage("LAYER_NUMBER"),
|
getMessage("BOTTOM_HEIGHT"),
|
getMessage("TOP_HEIGHT"),
|
getMessage("COMPANY"),
|
getMessage("DATE")
|
};
|
|
// ´´½¨±í¸ñÄ£ÐÍ
|
tableModel = new DefaultTableModel(columnNames, 0) {
|
@Override
|
public boolean isCellEditable(int row, int column) {
|
return false;
|
}
|
};
|
|
// ´´½¨±í¸ñ
|
layerTable = new JTable(tableModel);
|
layerTable.setAutoCreateRowSorter(true);
|
layerTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
|
// ÉèÖÃÁпí
|
TableColumnModel columnModel = layerTable.getColumnModel();
|
columnModel.getColumn(0).setPreferredWidth(50); // ÐòºÅ
|
columnModel.getColumn(1).setPreferredWidth(100); // ²ã±àºÅ
|
columnModel.getColumn(2).setPreferredWidth(100); // ²ãµ×¸ß
|
columnModel.getColumn(3).setPreferredWidth(100); // ²ã¶¥¸ß
|
columnModel.getColumn(4).setPreferredWidth(200); // ËùÊô¹«Ë¾
|
columnModel.getColumn(5).setPreferredWidth(200); // Ìí¼Óʱ¼ä
|
|
// ÉèÖñíÍ·Ñùʽ
|
JTableHeader header = layerTable.getTableHeader();
|
header.setBackground(Color.GRAY);
|
header.setForeground(Color.WHITE);
|
header.setFont(header.getFont().deriveFont(Font.BOLD));
|
|
// ´´½¨±íÍ·äÖȾÆ÷
|
DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer() {
|
{
|
setHorizontalAlignment(SwingConstants.LEFT);
|
setBackground(Color.GRAY);
|
setForeground(Color.WHITE);
|
setFont(getFont().deriveFont(Font.BOLD));
|
}
|
};
|
|
// Ó¦ÓñíÍ·äÖȾÆ÷
|
for (int i = 0; i < layerTable.getColumnCount(); i++) {
|
layerTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer);
|
}
|
|
JScrollPane scrollPane = new JScrollPane(layerTable);
|
scrollPane.setPreferredSize(new Dimension(900, 400));
|
|
// Ìí¼Ó×é¼þ
|
add(topPanel, BorderLayout.NORTH);
|
add(scrollPane, BorderLayout.CENTER);
|
|
// ¼ÓÔØÊý¾Ý
|
loadLayerData();
|
|
// Ìí¼Óʼþ¼àÌýÆ÷
|
addButton.addActionListener(e -> addNewLayer());
|
editButton.addActionListener(e -> editSelectedLayer());
|
deleteButton.addActionListener(e -> deleteSelectedLayers());
|
refreshButton.addActionListener(e -> loadLayerData());
|
searchButton.addActionListener(e -> searchLayers());
|
resetButton.addActionListener(e -> resetSearch());
|
}
|
|
private void loadLayerData() {
|
try {
|
allLayers = Dell_LayerManagement.getAllLayers();
|
updateTable(allLayers);
|
} catch (SQLException ex) {
|
JOptionPane.showMessageDialog(this, getMessage("DATA_LOAD_ERROR") + ": " + ex.getMessage(),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
}
|
}
|
|
// ËÑË÷Â¥²ã
|
private void searchLayers() {
|
String keyword = searchField.getText().trim();
|
if (keyword.isEmpty()) {
|
updateTable(allLayers);
|
return;
|
}
|
|
List<LayerManagement> filtered = new ArrayList<>();
|
for (LayerManagement layer : allLayers) {
|
if (layer.getLayerNumber().toLowerCase().contains(keyword.toLowerCase())) {
|
filtered.add(layer);
|
}
|
}
|
|
if (filtered.isEmpty()) {
|
JOptionPane.showMessageDialog(this, getMessage("SEARCH_NO_RESULTS"),
|
getMessage("INFO"), JOptionPane.INFORMATION_MESSAGE);
|
}
|
|
updateTable(filtered);
|
}
|
|
// ÖØÖÃËÑË÷
|
private void resetSearch() {
|
searchField.setText("");
|
updateTable(allLayers);
|
}
|
|
private void updateTable(List<LayerManagement> layers) {
|
tableModel.setRowCount(0);
|
|
int index = 1;
|
for (LayerManagement layer : layers) {
|
tableModel.addRow(new Object[]{
|
index++,
|
layer.getLayerNumber(),
|
layer.getBottomHeight(),
|
layer.getTopHeight(),
|
layer.getCompany(),
|
layer.getAddTime()
|
});
|
}
|
}
|
|
private void addNewLayer() {
|
LayerEditDialog dialog = new LayerEditDialog(
|
(Frame) SwingUtilities.getWindowAncestor(this),
|
messages,
|
true,
|
null
|
);
|
dialog.setVisible(true);
|
|
if (dialog.isConfirmed()) {
|
LayerManagement newLayer = dialog.getLayer();
|
|
// ÑéÖ¤ÊäÈë
|
if (validateInput(newLayer)) {
|
// ¼ì²é²ã±àºÅÊÇ·ñΨһ
|
if (isLayerNumberExists(newLayer.getLayerNumber())) {
|
JOptionPane.showMessageDialog(this, getMessage("LAYER_NUMBER_EXISTS"),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return;
|
}
|
|
// ±£´æµ½Êý¾Ý¿â
|
if (saveLayerToDatabase(newLayer)) {
|
// ¸üÐÂÄÚ´æÊý¾Ý
|
allLayers.add(newLayer);
|
updateTable(allLayers);
|
}
|
}
|
}
|
}
|
|
private void editSelectedLayer() {
|
int selectedRow = layerTable.getSelectedRow();
|
if (selectedRow == -1) {
|
JOptionPane.showMessageDialog(this, getMessage("SELECT_LAYER_TO_EDIT"),
|
getMessage("WARNING"), JOptionPane.WARNING_MESSAGE);
|
return;
|
}
|
|
// »ñȡѡÖеÄÂ¥²ã
|
int modelRow = layerTable.convertRowIndexToModel(selectedRow);
|
String layerNumber = (String) tableModel.getValueAt(modelRow, 1);
|
LayerManagement layer = findLayerByNumber(layerNumber);
|
|
if (layer == null) {
|
JOptionPane.showMessageDialog(this, getMessage("LAYER_NOT_FOUND"),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return;
|
}
|
|
LayerEditDialog dialog = new LayerEditDialog(
|
(Frame) SwingUtilities.getWindowAncestor(this),
|
messages,
|
false,
|
layer
|
);
|
dialog.setVisible(true);
|
|
if (dialog.isConfirmed()) {
|
LayerManagement updatedLayer = dialog.getLayer();
|
|
// ÑéÖ¤ÊäÈë
|
if (validateInput(updatedLayer)) {
|
// ¸üÐÂÂ¥²ãÐÅÏ¢
|
layer.setBottomHeight(updatedLayer.getBottomHeight());
|
layer.setTopHeight(updatedLayer.getTopHeight());
|
layer.setCompany(updatedLayer.getCompany());
|
|
// ¸üÐÂÊý¾Ý¿â
|
if (updateLayerInDatabase(layer)) {
|
// ¸üбí¸ñ
|
updateTable(allLayers);
|
}
|
}
|
}
|
}
|
|
private void deleteSelectedLayers() {
|
int[] selectedRows = layerTable.getSelectedRows();
|
if (selectedRows.length == 0) {
|
JOptionPane.showMessageDialog(this, getMessage("SELECT_LAYER_TO_DELETE"),
|
getMessage("WARNING"), JOptionPane.WARNING_MESSAGE);
|
return;
|
}
|
|
int confirm = JOptionPane.showConfirmDialog(this,
|
getMessage("CONFIRM_DELETE") + " " + selectedRows.length + " " + getMessage("LAYERS") + "?",
|
getMessage("CONFIRM"), JOptionPane.YES_NO_OPTION);
|
|
if (confirm == JOptionPane.YES_OPTION) {
|
Arrays.sort(selectedRows);
|
for (int i = selectedRows.length - 1; i >= 0; i--) {
|
int viewRow = selectedRows[i];
|
int modelRow = layerTable.convertRowIndexToModel(viewRow);
|
|
String layerNumber = (String) tableModel.getValueAt(modelRow, 1);
|
LayerManagement layer = findLayerByNumber(layerNumber);
|
|
if (layer != null) {
|
// ´ÓÊý¾Ý¿âɾ³ý
|
if (deleteLayerFromDatabase(layer)) {
|
// ´ÓÄÚ´æÊý¾Ýɾ³ý
|
allLayers.remove(layer);
|
}
|
}
|
}
|
|
// ˢбí¸ñ
|
updateTable(allLayers);
|
}
|
}
|
|
private boolean validateInput(LayerManagement layer) {
|
// ²ã±àºÅ²»ÄÜΪ¿Õ
|
if (layer.getLayerNumber() == null || layer.getLayerNumber().trim().isEmpty()) {
|
JOptionPane.showMessageDialog(this, getMessage("LAYER_NUMBER_REQUIRED"),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return false;
|
}
|
|
// ²ãµ×¸ß²»ÄÜΪ¿ÕÇÒΪÊý×Ö
|
try {
|
Integer.parseInt(layer.getBottomHeight());
|
} catch (NumberFormatException e) {
|
JOptionPane.showMessageDialog(this, getMessage("BOTTOM_HEIGHT_NUMBER"),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return false;
|
}
|
|
// ²ã¶¥¸ß²»ÄÜΪ¿ÕÇÒΪÊý×Ö
|
try {
|
Integer.parseInt(layer.getTopHeight());
|
} catch (NumberFormatException e) {
|
JOptionPane.showMessageDialog(this, getMessage("TOP_HEIGHT_NUMBER"),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return false;
|
}
|
|
// ²ã¶¥¸ßÓ¦´óÓÚ²ãµ×¸ß
|
int bottom = Integer.parseInt(layer.getBottomHeight());
|
int top = Integer.parseInt(layer.getTopHeight());
|
if (top <= bottom) {
|
JOptionPane.showMessageDialog(this, getMessage("TOP_HEIGHT_GREATER"),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return false;
|
}
|
|
return true;
|
}
|
|
private boolean isLayerNumberExists(String layerNumber) {
|
for (LayerManagement layer : allLayers) {
|
if (layer.getLayerNumber().equals(layerNumber)) {
|
return true;
|
}
|
}
|
return false;
|
}
|
|
private LayerManagement findLayerByNumber(String layerNumber) {
|
for (LayerManagement layer : allLayers) {
|
if (layer.getLayerNumber().equals(layerNumber)) {
|
return layer;
|
}
|
}
|
return null;
|
}
|
|
private boolean saveLayerToDatabase(LayerManagement layer) {
|
try {
|
Dell_LayerManagement.insertLayer(layer);
|
JOptionPane.showMessageDialog(this, getMessage("SAVE_SUCCESS"),
|
getMessage("SUCCESS"), JOptionPane.INFORMATION_MESSAGE);
|
return true;
|
} catch (SQLException ex) {
|
JOptionPane.showMessageDialog(this, getMessage("SAVE_FAILED") + ": " + ex.getMessage(),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return false;
|
}
|
}
|
|
private boolean updateLayerInDatabase(LayerManagement layer) {
|
try {
|
Dell_LayerManagement.updateLayer(layer);
|
JOptionPane.showMessageDialog(this, getMessage("UPDATE_SUCCESS"),
|
getMessage("SUCCESS"), JOptionPane.INFORMATION_MESSAGE);
|
return true;
|
} catch (SQLException ex) {
|
JOptionPane.showMessageDialog(this, getMessage("UPDATE_FAILED") + ": " + ex.getMessage(),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return false;
|
}
|
}
|
|
private boolean deleteLayerFromDatabase(LayerManagement layer) {
|
String idStr = layer.getId();
|
// ¼ì²éIDÊÇ·ñÓÐЧ
|
if (idStr == null || idStr.trim().isEmpty()) {
|
JOptionPane.showMessageDialog(this, getMessage("INVALID_LAYER_ID"),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return false;
|
}
|
try {
|
int id = Integer.parseInt(idStr);
|
Dell_LayerManagement.deleteLayer(id);
|
JOptionPane.showMessageDialog(this, getMessage("DELETE_SUCCESS"),
|
getMessage("SUCCESS"), JOptionPane.INFORMATION_MESSAGE);
|
return true;
|
} catch (NumberFormatException e) {
|
JOptionPane.showMessageDialog(this, getMessage("INVALID_LAYER_ID") + ": " + idStr,
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return false;
|
} catch (SQLException ex) {
|
JOptionPane.showMessageDialog(this, getMessage("DELETE_FAILED") + ": " + ex.getMessage(),
|
getMessage("ERROR"), JOptionPane.ERROR_MESSAGE);
|
return false;
|
}
|
}
|
|
private String getMessage(String key) {
|
try {
|
return messages.getString(key);
|
} catch (Exception e) {
|
return "[" + key + "]";
|
}
|
}
|
|
// Â¥²ã±à¼¶Ô»°¿ò
|
class LayerEditDialog extends JDialog {
|
private static final long serialVersionUID = 1L;
|
private JTextField numberField;
|
private JTextField bottomHeightField;
|
private JTextField topHeightField;
|
private JComboBox<String> companyComboBox;
|
private boolean confirmed = false;
|
|
public LayerEditDialog(Frame parent, ResourceBundle messages, boolean isAddDialog, LayerManagement existingLayer) {
|
super(parent, isAddDialog ? getMessage("ADD_LAYER") : getMessage("EDIT_LAYER"), true);
|
setLayout(new BorderLayout());
|
setSize(400, 200);
|
setLocationRelativeTo(parent);
|
|
JPanel formPanel = new JPanel(new GridLayout(4, 2, 5, 5));
|
formPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
|
|
// ²ã±àºÅ
|
JLabel numberLabel = new JLabel(getMessage("LAYER_NUMBER") + ": *");
|
numberField = new JTextField();
|
if (!isAddDialog && existingLayer != null) {
|
numberField.setEditable(false); // ±à¼Ä£Ê½Ï²»¿ÉÐÞ¸Ä
|
}
|
formPanel.add(numberLabel);
|
formPanel.add(numberField);
|
|
// ²ãµ×¸ß
|
JLabel bottomLabel = new JLabel(getMessage("BOTTOM_HEIGHT") + " (cm): *");
|
bottomHeightField = new JTextField();
|
formPanel.add(bottomLabel);
|
formPanel.add(bottomHeightField);
|
|
// ²ã¶¥¸ß
|
JLabel topLabel = new JLabel(getMessage("TOP_HEIGHT") + " (cm): *");
|
topHeightField = new JTextField();
|
formPanel.add(topLabel);
|
formPanel.add(topHeightField);
|
|
// ËùÊô¹«Ë¾
|
JLabel companyLabel = new JLabel(getMessage("COMPANY") + ": *");
|
companyComboBox = new JComboBox<>();
|
String[] companyNames = Dell_company.getAllCompanyNames();
|
for (String name : companyNames) {
|
companyComboBox.addItem(name);
|
}
|
formPanel.add(companyLabel);
|
formPanel.add(companyComboBox);
|
|
// Èç¹ûÊDZ༶Ի°¿ò£¬Ìî³äÏÖÓÐÊý¾Ý
|
if (!isAddDialog && existingLayer != null) {
|
numberField.setText(existingLayer.getLayerNumber());
|
bottomHeightField.setText(existingLayer.getBottomHeight());
|
topHeightField.setText(existingLayer.getTopHeight());
|
companyComboBox.setSelectedItem(existingLayer.getCompany());
|
}
|
|
add(formPanel, BorderLayout.CENTER);
|
|
// °´Å¥Ãæ°å
|
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
|
JButton okButton = new JButton(getMessage("OK"));
|
JButton cancelButton = new JButton(getMessage("CANCEL"));
|
|
okButton.addActionListener(e -> {
|
confirmed = true;
|
dispose();
|
});
|
|
cancelButton.addActionListener(e -> dispose());
|
|
buttonPanel.add(okButton);
|
buttonPanel.add(cancelButton);
|
add(buttonPanel, BorderLayout.SOUTH);
|
}
|
|
public LayerManagement getLayer() {
|
if (!confirmed) {
|
return null;
|
}
|
LayerManagement layer = new LayerManagement();
|
layer.setLayerNumber(numberField.getText());
|
layer.setBottomHeight(bottomHeightField.getText());
|
layer.setTopHeight(topHeightField.getText());
|
layer.setCompany((String) companyComboBox.getSelectedItem());
|
|
// ÉèÖÃÌí¼Óʱ¼ä
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
layer.setAddTime(sdf.format(new Date()));
|
|
return layer;
|
}
|
|
public boolean isConfirmed() {
|
return confirmed;
|
}
|
}
|
|
}
|