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<Vector<String>> rowData = null;
|
private static Set<Anchor> 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<String> 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<Anchor> 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<String> 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;
|
}
|
}
|