package com.example.client.utils; import com.example.client.dto.ColumnDto; import com.example.client.dto.JComboBoxItem; import com.example.server.sysOss.service.SysOssService; 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.plaf.basic.BasicComboBoxRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableModel; import java.awt.*; import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class CommonTable { public static JTable createCommonTable(List list, List dtoList) { TableModel dataModel = createCommonTableModel(list, dtoList); JTable table = new JTable() { @Override public boolean isCellEditable(int row, int column) { return dtoList.get(column).getIsEdit(); } }; table.setModel(dataModel); setColumnType(dtoList,table); return table; } public static void setColumnType(List dtoList, JTable table) { for (int j = 0; j < dtoList.size(); j++) { table.getColumnModel().getColumn(j).setPreferredWidth(dtoList.get(j).getColumnWidth()); if (dtoList.get(j).getButtonList() != null) { CreateTableButton.AcceptRejectRenderer renderer = new CreateTableButton.AcceptRejectRenderer(dtoList.get(j).getButtonList()); table.getColumnModel().getColumn(j).setCellRenderer(renderer); table.getColumnModel().getColumn(j).setCellEditor(new CreateTableButton.AcceptRejectEditor(dtoList.get(j).getButtonList())); } if ("selectDate".equals(dtoList.get(j).getColumnType())) { JXDatePicker datePicker = new JXDatePicker(); datePicker.setFormats("yyyy-MM-dd"); datePicker.addActionListener(e -> { // 停止单元格编辑,关闭弹出窗口 TableCellEditor editor = table.getCellEditor(); if (editor != null) { editor.stopCellEditing(); } }); table.getColumnModel().getColumn(j).setCellEditor(new DatePickerEditor(datePicker)); } if ("dict".equals(dtoList.get(j).getColumnType())) { Map itemMap = new HashMap<>(); JComboBoxItem[] dictList = dtoList.get(j).getDictList(); for (JComboBoxItem item : dictList) { itemMap.put(item.getId(), item); } // 创建 JComboBox 并添加 Item 对象 JComboBox comboBox = new JComboBox<>(dictList); // 设置自定义渲染器 comboBox.setRenderer(new BasicComboBoxRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof JComboBoxItem) { JComboBoxItem item = (JComboBoxItem) value; setText(item.getName()); // 显示 name } return this; } }); table.getColumnModel().getColumn(j).setCellRenderer(new CellComboBoxRenderer(itemMap)); table.getColumnModel().getColumn(j).setCellEditor(new CellComboBoxEditor(comboBox, itemMap)); } if ("dicts".equals(dtoList.get(j).getColumnType())) { Map itemMap = new HashMap<>(); JComboBoxItem[] dictList = dtoList.get(j).getDictList(); for (JComboBoxItem item : dictList) { itemMap.put(item.getId(), item); } // 创建 JComboBox 并添加 Item 对象 JComboBox comboBox = new JComboBox<>(dictList); // 设置自定义渲染器 comboBox.setRenderer(new BasicComboBoxRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof JComboBoxItem) { JComboBoxItem item = (JComboBoxItem) value; setText(item.getName()); // 显示 name } return this; } }); table.getColumnModel().getColumn(j).setCellRenderer(new CellComboBoxRenderer(itemMap)); table.getColumnModel().getColumn(j).setCellEditor(new CellComboBoxEditor(comboBox, itemMap)); } } } public static void refreshTable(List list, List dtoList, JTable table) { TableModel dataModel = createCommonTableModel(list, dtoList); table.setModel(dataModel); setColumnType(dtoList,table); } public static TableModel createCommonTableModel(List list, List dtoList) { String[][] rowData = new String[list.size()][dtoList.size()]; for (int i = 0; i < list.size(); i++) { Object object = list.get(i); Class c1azz = object.getClass(); for (int j = 0; j < dtoList.size(); j++) { Method method = null; try { String fieldName = dtoList.get(j).getColumnName(); String valueStr = ""; if (StringUtils.isNotBlank(fieldName)) { method = c1azz.getMethod("get" + StringUtils.capitalize(fieldName)); Object value = method.invoke(object); if (value != null) { valueStr = value.toString(); } } if (StringUtils.isBlank(dtoList.get(j).getColumnType()) || dtoList.get(j).getColumnType().equals("selectDate")) { rowData[i][j] = valueStr; } else if (dtoList.get(j).getColumnType().equals("dict")) { rowData[i][j] = valueStr; } else if (dtoList.get(j).getColumnType().equals("dicts")) { rowData[i][j] = valueStr; } else if (dtoList.get(j).getColumnType().equals("autoCreate")) { rowData[i][j] = "" + (i + 1); } } catch (Exception e) { e.printStackTrace(); } } } String[] columnNames = new String[dtoList.size()]; for (int j = 0; j < dtoList.size(); j++) { columnNames[j] = dtoList.get(j).getColumnDesc(); } TableModel dataModel = new DefaultTableModel(rowData, columnNames); return dataModel; } public static void saveTableList(List list, JTable table, List dtoList) { for (int i = 0; i < table.getModel().getRowCount(); i++) { Object object = list.get(i); Class c1azz = object.getClass(); for (int j = 0; j < dtoList.size(); j++) { Method method = null; try { String fieldName = dtoList.get(j).getColumnName(); if (StringUtils.isNotBlank(fieldName)) { if ("dict".equals(dtoList.get(j).getColumnType())) { method = c1azz.getMethod("set" + StringUtils.capitalize(fieldName), Long.class); } else { method = c1azz.getMethod("set" + StringUtils.capitalize(fieldName), String.class); } Object value = table.getModel().getValueAt(i, j); if (value != null) { if ("selectDate".equals(dtoList.get(j).getColumnType())) { method.invoke(object, value.toString()); System.out.println(value.toString().length()); String valueStr = value.toString(); Method method2 = c1azz.getMethod("set" + StringUtils.capitalize(fieldName) + "Digit", Long.class); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = format.parse(valueStr); } catch (ParseException e) { e.printStackTrace(); } Long timestamp = date.getTime(); method2.invoke(object, timestamp); } else if ("dict".equals(dtoList.get(j).getColumnType())) { method.invoke(object, Long.parseLong(value.toString())); } else { method.invoke(object, value.toString()); } } } } catch (Exception e) { e.printStackTrace(); } } } } }