package com.example.client.service; import com.example.client.dto.ColumnDto; import com.example.client.dto.JComboBoxItem; import com.example.client.model.TableButton; import com.example.client.utils.CommonTable; import com.example.client.utils.GBC; import com.example.server.progressTrack.model.DjJdgzNetworkLevel1; import com.example.server.progressTrack.model.DjJdgzShip; import com.example.server.progressTrack.service.*; import org.apache.commons.lang3.StringUtils; import org.jdesktop.swingx.JXDatePicker; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.swing.*; import javax.swing.event.TableModelEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import java.awt.*; import java.awt.event.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.List; @Service public class Level1ManageService { @Autowired private DjJdgzNetworkLevel1Service level1Service; @Autowired private DjJdgzShipService djJdgzShipService; @Autowired private Level1AddOrUpdate addOrUpdate; // 注入 AddOrupdate 实例 private JTable table; private List list; private Map shipMap = new HashMap<>(); private List columnDto; public JPanel createTable(Integer width, Integer height, JFrame jFrame) { JPanel panel = new JPanel(); JPanel topJpanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); topJpanel.setPreferredSize(new Dimension(width, 37)); topJpanel.setBackground(Color.WHITE); JPanel centerJpanel = new JPanel(); centerJpanel.setPreferredSize(new Dimension(width - 20, height - 100)); centerJpanel.setBackground(Color.WHITE); panel.add(topJpanel, BorderLayout.NORTH); panel.add(centerJpanel, BorderLayout.CENTER); List shipList = djJdgzShipService.getList(); JComboBox comboBox = new JComboBox(); JButton btnInsert = new JButton("新增"); topJpanel.add(comboBox); topJpanel.add(btnInsert); comboBox.setPreferredSize(new Dimension(300, 28)); list = level1Service.getList(shipList.get(0).getId()); List buttonList = new ArrayList<>(); buttonList.add(new TableButton("edit", "编辑")); buttonList.add(new TableButton("del", "删除")); columnDto = new ArrayList<>(); //columnDto.add(new ColumnDto("ID", "id", -1, null,false)); columnDto.add(new ColumnDto("序号", "", (width - 10) / 4, "autoCreate", false, null,null)); columnDto.add(new ColumnDto("工程", "ProjectName", (width - 10) / 4, null, false, null,null)); columnDto.add(new ColumnDto("起始时间", "StartDate", (width - 10) / 4, "selectDate", false, null,null)); columnDto.add(new ColumnDto("操作", "", (width - 10) / 4, "", true, buttonList,null)); table = CommonTable.createCommonTable(list, columnDto); table.setRowHeight(25); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); final Boolean[] isFirstLoadData = {true}; comboBox.addItemListener(new ItemListener() { public void itemStateChanged(final ItemEvent event) { String content = comboBox.getSelectedItem().toString(); Long shipId = shipMap.get(content); list = level1Service.getList(shipId); if (!isFirstLoadData[0]) { CommonTable.refreshTable(list, columnDto,table); table.setRowHeight(25); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); tableModelListener(table,jFrame); }else{ isFirstLoadData[0] = false; } } }); for (int i = 0; i < shipList.size(); i++) { shipMap.put(shipList.get(i).getShipNo(), shipList.get(i).getId()); comboBox.addItem(shipList.get(i).getShipNo()); } comboBox.setSelectedItem(shipList.get(0).getShipNo()); tableModelListener(table,jFrame); btnInsert.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { jFrame.setEnabled(false); insert(jFrame); } }); JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scrollPane.setViewportView(table); scrollPane.getViewport().setBackground(Color.WHITE); scrollPane.setPreferredSize(new Dimension(width - 20, height - 100)); centerJpanel.add(scrollPane); return panel; } private void insert(JFrame jFrame) { JFrame frame1 = new JFrame("新增一级网络图"); frame1.setSize(350, 400); frame1.setResizable(true); frame1.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); frame1.setLocationRelativeTo(null); frame1.setVisible(true); frame1.addWindowListener(new WindowAdapter() { //添加第二个界面的关闭事件: public void windowClosing(WindowEvent e) { //添加事件: jFrame.setEnabled(true);//将主界面再设置为可操作的 } }); GridBagLayout layout = new GridBagLayout(); frame1.setLayout(layout); JComboBoxItem[] shipList = djJdgzShipService.getListByItem(); JComboBoxItem[] levelList = { new JComboBoxItem(1L, "一级"), new JComboBoxItem(1L, "二级"), new JComboBoxItem(1L, "三级"), }; JLabel JLabel1 = new JLabel("玄号"); JComboBox comboBox0 = new JComboBox<>(shipList); comboBox0.setPreferredSize(new Dimension(185, 28)); JLabel JLabel2 = new JLabel("修理等级"); JComboBox comboBox1 = new JComboBox<>(levelList); comboBox1.setPreferredSize(new Dimension(185, 28)); JLabel JLabel3 = new JLabel("年份"); JSpinner yearPicker = new JSpinner(new SpinnerNumberModel(2024, 1900, 2100, 1)); // 当前年份为2024,范围为1900-2100,步长为1 yearPicker.setPreferredSize(new Dimension(185, 28)); Font font = new Font("宋体", Font.BOLD, 23); yearPicker.setFont(font); JSpinner.NumberEditor editor1 = new JSpinner.NumberEditor(yearPicker, "#"); JTextField textField = editor1.getTextField(); textField.setHorizontalAlignment(JTextField.LEFT); // 文字居右 textField.setFont(font); // 设置字体 yearPicker.setEditor(editor1); JLabel JLabel4 = new JLabel("起始时间"); JXDatePicker beginDate = new JXDatePicker(); beginDate.setPreferredSize(new Dimension(185, 28)); SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd"); beginDate.setFormats(sdFormat); beginDate.setDate(null); beginDate.addActionListener(e -> { // 停止单元格编辑,关闭弹出窗口 TableCellEditor editor = table.getCellEditor(); if (editor != null) { editor.stopCellEditing(); } }); JButton btnSave = new JButton("保存"); frame1.add(JLabel1, new GBC(0, 0,1,1).setAnchor(GBC.SOUTHEAST).setInsets(5)); frame1.add(comboBox0, new GBC(1, 0, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5)); frame1.add(JLabel2, new GBC(0, 1, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5)); frame1.add(comboBox1, new GBC(1, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5)); frame1.add(JLabel3, new GBC(0, 2,1,1).setAnchor(GBC.SOUTHEAST).setInsets(5)); frame1.add(yearPicker, new GBC(1, 2, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5)); frame1.add(JLabel4, new GBC(0, 3,1,1).setAnchor(GBC.SOUTHEAST).setInsets(5)); frame1.add(beginDate, new GBC(1, 3, 1, 1).setAnchor(GBC.NORTHWEST).setInsets(5)); frame1.add(btnSave, new GBC(0, 4, 2, 1).setWeight(1, 0)); btnSave.addActionListener((e) -> { JComboBoxItem ship = (JComboBoxItem) comboBox0.getSelectedItem(); JComboBoxItem level = (JComboBoxItem) comboBox1.getSelectedItem(); DjJdgzNetworkLevel1 data = new DjJdgzNetworkLevel1(); data.setShipId(ship.getId()); data.setMaintainLevel(Math.toIntExact(level.getId())); data.setStartDate(sdFormat.format(beginDate.getDate())); data.setYear((Integer) yearPicker.getValue()); data.setAdventDay(7); data.setProjectName(level.getName()+"修理"+ship.getName()+"项目"); level1Service.insert(data); list = level1Service.getList(ship.getId()); CommonTable.refreshTable(list,columnDto,table); table.setRowHeight(25); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); tableModelListener(table,jFrame); frame1.dispose(); jFrame.setEnabled(true);//将主界面再设置为可操作的 }); } public void tableModelListener(JTable table,JFrame jFrame){ table.getModel().addTableModelListener(e -> { // 检查事件类型 if (e.getType() == TableModelEvent.UPDATE) { // 获取变化的行和列 int row = e.getFirstRow(); int column = e.getColumn(); // 获取新的值 Object newValue = table.getModel().getValueAt(row, column); // 输出变化信息 if (newValue.equals("edit")){ DjJdgzNetworkLevel1 data = list.get(row); addOrUpdate.openDialog(data,jFrame); jFrame.setEnabled(false); }else if(newValue.equals("del")) { int n = JOptionPane.showConfirmDialog(null, "是否删除?", "提示", JOptionPane.YES_NO_OPTION); if (n == 0) { DefaultTableModel model = (DefaultTableModel) table.getModel(); DjJdgzNetworkLevel1 data = list.get(row); level1Service.deleteLevel1(data.getId()); list.remove(row); model.removeRow(row); } } System.out.println("单元格变化: 行=" + row + ", 列=" + column + ", 新值=" + newValue); } }); } }