package index.JPanelMoudle; import Anchor.Anchor; import Anchor.anchor_Dell; import tools.ShowMessage; import javax.swing.*; import javax.swing.border.TitledBorder; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.Vector; public class anchorListComp { private static JPanel ancList_jp;//基站列表面板 private static JTable ancTable;//基站列表 private static DefaultTableModel model;//表格模型 private static JButton select_anc;//扫描信标按钮 private static JScrollPane scrollPane1;//解析数据滚动面板 private static Vector> rowData = null; private static Set existingIds = new HashSet<>(); ; // 获取 ancList_jp 面板,若为空则创建 public static JPanel getAncList_jp() { if (ancList_jp == null) { ancList_jp = new JPanel(); // 初始化该面板 ancList_jp.setBorder(new TitledBorder("信标列表")); } return ancList_jp; } public static JTable getAncTable() { if (ancTable == null) { String[] columnNames = {"设备ID", "测距距离(cm)"}; // 表格列名 Vector columnName = new Vector<>(); for (int i = 0; i < columnNames.length; i++) { columnName.add(columnNames[i]); } // 表格初始化 ancTable = new JTable(rowData, columnName) { private static final long serialVersionUID = 1L; // 禁止编辑 public boolean isCellEditable(int row, int column) { return false; } // 重写 prepareRenderer 实现隔行变色 @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); // 设置隔行变色:偶数行为白色,奇数行为灰色 if (!isRowSelected(row)) { if (row % 2 == 0) { c.setBackground(new Color(240, 240, 240)); // 偶数行灰色 } else { c.setBackground(Color.white); // 奇数行白色 } } return c; } }; ancTable.setColumnSelectionAllowed(false); ancTable.getTableHeader().setReorderingAllowed(false); // 设置表格样式 setShowStyle(); // 设置列头样式 ancTable.getTableHeader().setPreferredSize(new Dimension(ancTable.getTableHeader().getPreferredSize().width, 40)); DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer(); headerRenderer.setHorizontalAlignment(SwingConstants.CENTER); // 列头文字居中 for (int i = 0; i < ancTable.getColumnCount(); i++) { ancTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); } // 设置行高 ancTable.setRowHeight(35); // 设置每行的高度为35像素 // 获取表格模型并加载数据 model = (DefaultTableModel) ancTable.getModel(); getRowData(anchor_Dell.getAnchors()); ancTable.revalidate(); ancTable.repaint(); } return ancTable; } public static void getRowData(Vector s2_vector) { // 遍历新数据 for (Anchor s2 : s2_vector) { String anchorId = s2.getAnchorId().trim(); String newDistance = s2.getDistance().trim(); boolean found = false; // 遍历现有模型,判断是否存在相同的 AnchorId for (int i = 0; i < model.getRowCount(); i++) { String existingId = ((String) model.getValueAt(i, 0)).trim(); String existingDistance = ((String) model.getValueAt(i, 1)).trim(); if (existingId.equals(anchorId)) { found = true; // 如果距离不同,更新模型 if (!existingDistance.equals(newDistance)) { model.setValueAt(newDistance, i, 1); // 更新距离 } break; } } // 如果没有找到,添加新行 if (!found) { Vector row = new Vector<>(); row.add(anchorId); row.add(newDistance); model.addRow(row); } } } // 获取 select_anc 按钮,若为空则创建 public static JButton getSelect_anc() { if (select_anc == null) { select_anc = new JButton("扫描信标"); // 初始化该按钮 select_anc.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (ComMoudleComp.isChuankou()) { updateTable(); ShowMessage.zidingyi("正在重新扫描信标"); } else { ShowMessage.zidingyi("请先打开串口"); } } }); } return select_anc; } // 获取 解析数据滚动面板,若为空则创建 public static JScrollPane getScrollPane1() { if (scrollPane1 == null) { scrollPane1 = new JScrollPane(); // 初始化该滚动面板 } return scrollPane1; } //设置表格显示风格 private static void setShowStyle() { // 获取表格的列数 int columnCount = ancTable.getColumnCount(); // 创建一个默认的单元格渲染器,用于居中显示 DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setHorizontalAlignment(SwingConstants.CENTER); // 为每一列设置该渲染器 for (int i = 0; i < columnCount; i++) { ancTable.getColumnModel().getColumn(i).setCellRenderer(renderer); } // 为列头设置居中渲染器 DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer(); headerRenderer.setHorizontalAlignment(SwingConstants.CENTER); for (int i = 0; i < columnCount; i++) { // 设置列头的渲染器 ancTable.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer); } } //刷新表格的方法 public static void updateTable() { if (model != null) { // 清空所有行 existingIds.clear(); model.setRowCount(0); anchor_Dell.getAnchors().removeAllElements();//删除所有信标 getRowData(anchor_Dell.getAnchors()); scrollPane1.validate(); } } public static String getChooseAnchorId() { String anchorID = null; int selectedRow = anchorListComp.getAncTable().getSelectedRow(); if (selectedRow != -1) { anchorID = (String) anchorListComp.getAncTable().getValueAt(selectedRow, 0); } return anchorID; } }