package com.mes.ui; import com.alibaba.fastjson2.JSONObject; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.mes.component.MesRadio; import com.mes.component.MesWebView; import com.mes.netty.NettyClient; import com.mes.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.time.LocalDateTime; import java.util.*; import java.util.List; import java.util.Timer; public class MesClient extends JFrame { public static final Logger log = LoggerFactory.getLogger(MesClient.class); public static int mes_auth = 0; // 权限级别 0=无权限 1=操作工人 2=管理员 public static boolean tcp_connect_flag = false; //TCP连接状态 public static boolean allow_connect_again = false; // 是否允许断线重连, true 表示 允许 public static String user20 = ""; public static String sessionid = ""; public static NettyClient nettyClient; public static Boolean check_quality_result1 = false; public static Integer work_status1 = 0; public static Boolean check_quality_result2 = false; public static Integer work_status2 = 0; public static JButton finish_ok_bt_1; public static JButton finish_ng_bt_1; public static JTextField product_sn_1; public static JButton f_scan_data_bt_1; public static JButton status_menu_1; public static JTextField pressureText_1; // 压力值显示文本框 public static JTextField leakText_1; // 压力值显示文本框 public static JButton finish_ok_bt_2; public static JButton finish_ng_bt_2; public static JTextField product_sn_2; public static JButton f_scan_data_bt_2; public static JButton status_menu_2; public static JTextField pressureText_2; // 压力值显示文本框 public static JTextField leakText_2; // 压力值显示文本框 public static JPanel contentPane; public static MesClient mesClientFrame; public static JTabbedPane tabbedPane; public static JScrollPane indexScrollPaneA; public static JScrollPane searchScrollPane; public static JScrollPane searchScrollPaneDj; public static JPanel panel4; public static JScrollPane scrollPane4; public static JPanel panel5; public static JScrollPane scrollPane5; public static JButton heart_beat_menu; public static JButton user_menu; public static JFrame welcomeWin; public static JPanel indexPanelB; public static MesWebView jfxPanel = null; public static JPanel indexPanelC; public static MesWebView jfxPanel2 = null; public static MesRadio mesRadioHj; public static JTable table; public static Object[] columnNames = {"物料名称", "绑定批次", "剩余次数", "操作"}; public static Object[][] rowData = null; String currentSerialPort1 = Config.portName1; String currentSerialPort2 = Config.portName2; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { // 显示界面 mesClientFrame = new MesClient(); mesClientFrame.setVisible(false); JdbcUtils.getConn(); welcomeWin = new LoginFrame(); welcomeWin.setVisible(true); } catch (Exception e) { log.error(e.getMessage()); } } }); } // 初始化TCP public static void initTcpConnection() { try { if (nettyClient == null) { nettyClient = new NettyClient(); tcp_connect_flag = false; //设置TCP连接状态 DataUtil.synrTcp(nettyClient, Config.gw_1); } } catch (Exception e) { log.error("初始化TCP失败", e); } } //启动心跳包程序 public static java.util.Timer heartBeatTimer; public static java.util.Timer heartBeatIconTimer; public static boolean iconREDFlag = true; public static void startHeartBeatTimer() { if (heartBeatTimer != null) { heartBeatTimer.cancel(); } heartBeatTimer = new java.util.Timer(); heartBeatTimer.schedule(new TimerTask() { public void run() { if (nettyClient != null && tcp_connect_flag) { DataUtil.heartBeat(nettyClient, Config.gw_1); heart_beat_menu.setText(DateLocalUtils.getCurrentTime()); } } }, 100, Config.heart_beat_cycle * 1000); //心跳显示图标 if (heartBeatIconTimer != null) { heartBeatIconTimer.cancel(); } heartBeatIconTimer = new Timer(); heartBeatIconTimer.schedule(new TimerTask() { public void run() { if (tcp_connect_flag) { if (iconREDFlag) { heart_beat_menu.setIcon(new ImageIcon(MesClient.class.getResource("/bg/grey_dot.png"))); iconREDFlag = false; } else { heart_beat_menu.setIcon(new ImageIcon(MesClient.class.getResource("/bg/green_dot.png"))); iconREDFlag = true; } heart_beat_menu.setText(DateLocalUtils.getCurrentTime()); heart_beat_menu.setForeground(Color.GREEN); heart_beat_menu.repaint(); } else { heart_beat_menu.setIcon(new ImageIcon(MesClient.class.getResource("/bg/grey_dot.png"))); heart_beat_menu.setText("Mes连接断开"); heart_beat_menu.setForeground(Color.RED); heart_beat_menu.repaint(); //若未连接则尝试连接 if (nettyClient != null) { //TCP重新同步连接 if (allow_connect_again) { log.info("TCP连接已断开, 在心跳循环中, 发送同步连接请求"); allow_connect_again = false; // 只允许重新同步连接一次 DataUtil.synrTcp(nettyClient, Config.gw_1); } } } } }, 100, Config.heart_icon_cycle * 1000); } public static void initWarehouseData() { resetScanA(); resetScanB(); } public static void resetScanA() { MesClient.finish_ok_bt_1.setEnabled(false); MesClient.finish_ng_bt_1.setEnabled(false); MesClient.f_scan_data_bt_1.setEnabled(true); // product_sn_1.setText(""); // leakText_1.setText(""); // pressureText_1.setText(""); // MesClient.setMenuState_1("请扫工件码", 0); // WorkTimer.ateq1.resetFIFO(); work_status1 = 0; check_quality_result1 = false; } public static void resetScanB() { MesClient.finish_ok_bt_2.setEnabled(false); MesClient.finish_ng_bt_2.setEnabled(false); MesClient.f_scan_data_bt_2.setEnabled(true); // product_sn_2.setText(""); // leakText_2.setText(""); // pressureText_2.setText(""); // MesClient.setMenuState_2("请扫工件码", 0); // WorkTimer.ateq2.resetFIFO(); work_status2 = 0; check_quality_result2 = false; } public static int userLoginHours;//用户登录所处小时 //换班用户信息检查 private static void shiftUserCheck() { LocalDateTime now = LocalDateTime.now(); // 判断时间范围 if (userLoginHours >= 8 && userLoginHours < 20) { int hour = now.getHour(); if (hour >= 20 || hour < 8) { logoff(); } } else { int hour = now.getHour(); if (hour >= 8 && hour < 20) { logoff(); } } } //获取用户20位 public static void getUser() { user20 = user_menu.getText(); String space_tmp1 = ""; if (user20.length() < 20) { for (int i = 0; i < 20 - user20.length(); i++) { space_tmp1 = space_tmp1 + " "; } } user20 = user20 + space_tmp1; } //获取barcode内容36位 public static String getBarcode(String barcodeTmp) { String barcodeRet = barcodeTmp; if (barcodeTmp.equalsIgnoreCase("")) { return ""; } else { if (barcodeTmp.length() < 36) { String space = ""; for (int i = 0; i < 36 - barcodeTmp.length(); i++) { space = space + " "; } barcodeRet = barcodeTmp + space; } } return barcodeRet; } public static String getBarcode33(String barcodeTmp) { String barcodeRet = barcodeTmp; if (barcodeTmp.equalsIgnoreCase("")) { return ""; } else { if (barcodeTmp.length() < 33) { String space = ""; for (int i = 0; i < 33 - barcodeTmp.length(); i++) { space = space + " "; } barcodeRet = barcodeTmp + space; } } return barcodeRet; } public static void scanBarcode1() { if (work_status1 == 1) { JOptionPane.showMessageDialog(mesClientFrame, "工作中,勿扫码", "提示窗口", JOptionPane.INFORMATION_MESSAGE); return; } WorkTimer.ateq1.resetFIFO(); product_sn_1.setText(""); leakText_1.setText(""); pressureText_1.setText(""); MesClient.setMenuState_1("请扫工件码", 0); //弹窗扫工件码 String scanBarcode = JOptionPane.showInputDialog(null, "请扫工件码"); if (scanBarcode != null && !scanBarcode.equalsIgnoreCase("")) { product_sn_1.setText(scanBarcode); //刷新界面 mesClientFrame.repaint(); if (!tcp_connect_flag) { JOptionPane.showMessageDialog(mesClientFrame, "设备未连接Mes服务器", "提示窗口", JOptionPane.INFORMATION_MESSAGE); return; } // 查询工件质量 Boolean sendret = DataUtil.checkQuality(nettyClient, scanBarcode.trim(), user20, Config.gw_1); if (!sendret) { JOptionPane.showMessageDialog(mesClientFrame, "消息发送失败,请重试", "提示窗口", JOptionPane.INFORMATION_MESSAGE); } } else { JOptionPane.showMessageDialog(mesClientFrame, "请扫工件码", "提示窗口", JOptionPane.INFORMATION_MESSAGE); } } public static void scanBarcode2() { if (work_status2 == 1) { JOptionPane.showMessageDialog(mesClientFrame, "工作中,勿扫码", "提示窗口", JOptionPane.INFORMATION_MESSAGE); return; } WorkTimer.ateq2.resetFIFO(); product_sn_2.setText(""); leakText_2.setText(""); pressureText_2.setText(""); MesClient.setMenuState_2("请扫工件码", 0); //弹窗扫工件码 String scanBarcode = JOptionPane.showInputDialog(null, "请扫工件码"); if (scanBarcode != null && !scanBarcode.equalsIgnoreCase("")) { product_sn_2.setText(scanBarcode); //刷新界面 mesClientFrame.repaint(); if (!tcp_connect_flag) { JOptionPane.showMessageDialog(mesClientFrame, "设备未连接Mes服务器", "提示窗口", JOptionPane.INFORMATION_MESSAGE); return; } // 查询工件质量 Boolean sendret = DataUtil.checkQuality(nettyClient, scanBarcode.trim(), user20, Config.gw_2); if (!sendret) { JOptionPane.showMessageDialog(mesClientFrame, "消息发送失败,请重试", "提示窗口", JOptionPane.INFORMATION_MESSAGE); } } else { JOptionPane.showMessageDialog(mesClientFrame, "请扫工件码", "提示窗口", JOptionPane.INFORMATION_MESSAGE); } } public static void logoff() { mesClientFrame.setVisible(false); welcomeWin.setVisible(true); nettyClient = null; tcp_connect_flag = false; allow_connect_again = false; mes_auth = 0; UpdateQualityTimer.stop(); // 停止更新质量的定时任务 WorkTimer.stop(); } private static void createQRCode(String s) { log.info("准备生成二维码"); if(s == null || s.isEmpty()){ log.info("生成二维码失败: 工件码为空"); return; } s = s.trim(); try { BitMatrix bitMatrix = new QRCodeWriter().encode(s, BarcodeFormat.QR_CODE, 200, 200); BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix); JDialog qrDialog = new JDialog(mesClientFrame, "", Dialog.ModalityType.APPLICATION_MODAL); qrDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); qrDialog.setSize(250, 250); qrDialog.setLocationRelativeTo(mesClientFrame); qrDialog.setResizable(false); JLabel qrLabel = new JLabel(new ImageIcon(qrImage)); qrDialog.getContentPane().add(qrLabel, BorderLayout.CENTER); qrDialog.setVisible(true); } catch (Exception e) { log.error("生成二维码失败", e); } } public MesClient() { setIconImage(Toolkit.getDefaultToolkit().getImage(MesClient.class.getResource("/bg/logo.png"))); setTitle("MES系统客户端:OP310B/OP320 " + Config.gw_des_1); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(0, 0, 1024, 768); JMenuBar menuBar = new JMenuBar(); menuBar.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 26)); setJMenuBar(menuBar); JMenu fileMenu = new JMenu("用户"); fileMenu.setIcon(new ImageIcon(MesClient.class.getResource("/bg/user.png"))); fileMenu.setFont(new Font("微软雅黑", Font.PLAIN, 20)); menuBar.add(fileMenu); JMenuItem exitMenuItem = new JMenuItem("退出"); exitMenuItem.setIcon(new ImageIcon(MesClient.class.getResource("/bg/logoff.png"))); exitMenuItem.setFont(new Font("微软雅黑", Font.PLAIN, 22)); fileMenu.add(exitMenuItem); exitMenuItem.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) {//只能检测到mousePressed事件 super.mouseClicked(e); logoff(); } }); JMenu settingMenu = new JMenu("设置"); //settingMenu.setVisible(false); settingMenu.setIcon(new ImageIcon(MesClient.class.getResource("/bg/menu_setting.png"))); settingMenu.setFont(new Font("微软雅黑", Font.PLAIN, 20)); menuBar.add(settingMenu); JMenuItem resetTcpMenu = new JMenuItem("重连MES"); resetTcpMenu.setIcon(new ImageIcon(MesClient.class.getResource("/bg/reset_logo.png"))); resetTcpMenu.setFont(new Font("微软雅黑", Font.PLAIN, 20)); resetTcpMenu.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mouseClicked(e); //重连mes nettyClient.future.channel().close(); } }); settingMenu.add(resetTcpMenu); JMenuItem resetTcpMenu_1 = new JMenuItem("刷新" + Config.gw_1); resetTcpMenu_1.setIcon(new ImageIcon(MesClient.class.getResource("/bg/reset_logo.png"))); resetTcpMenu_1.setFont(new Font("微软雅黑", Font.PLAIN, 20)); resetTcpMenu_1.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mouseClicked(e); setMenuState_1("已手动刷新,请扫码", 0); resetScanA(); } }); settingMenu.add(resetTcpMenu_1); JMenuItem resetTcpMenu_2 = new JMenuItem("刷新" + Config.gw_2); resetTcpMenu_2.setIcon(new ImageIcon(MesClient.class.getResource("/bg/reset_logo.png"))); resetTcpMenu_2.setFont(new Font("微软雅黑", Font.PLAIN, 20)); resetTcpMenu_2.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mouseClicked(e); setMenuState_2("已手动刷新,请扫码", 0); resetScanB(); } }); settingMenu.add(resetTcpMenu_2); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BorderLayout(0, 0)); JToolBar toolBar = new JToolBar(); contentPane.add(toolBar, BorderLayout.NORTH); JLabel equipment_statu_label = new JLabel("状态:"); equipment_statu_label.setHorizontalAlignment(SwingConstants.CENTER); equipment_statu_label.setForeground(Color.BLACK); equipment_statu_label.setFont(new Font("微软雅黑", Font.PLAIN, 20)); equipment_statu_label.setBackground(Color.LIGHT_GRAY); toolBar.add(equipment_statu_label); JButton status_menu = new JButton(""); status_menu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); status_menu.setForeground(Color.GREEN); status_menu.setFont(new Font("微软雅黑", Font.PLAIN, 20)); status_menu.setBackground(Color.BLACK); toolBar.add(status_menu); JLabel space_1 = new JLabel(" "); toolBar.add(space_1); JLabel heart_beat_status_label = new JLabel("心跳:"); heart_beat_status_label.setHorizontalAlignment(SwingConstants.CENTER); heart_beat_status_label.setForeground(Color.BLACK); heart_beat_status_label.setFont(new Font("微软雅黑", Font.PLAIN, 20)); heart_beat_status_label.setBackground(Color.LIGHT_GRAY); toolBar.add(heart_beat_status_label); heart_beat_menu = new JButton(""); heart_beat_menu.setIcon(new ImageIcon(MesClient.class.getResource("/bg/green_dot.png"))); heart_beat_menu.setForeground(Color.GREEN); heart_beat_menu.setFont(new Font("微软雅黑", Font.PLAIN, 20)); heart_beat_menu.setBackground(Color.BLACK); toolBar.add(heart_beat_menu); JLabel space_2 = new JLabel(" "); toolBar.add(space_2); JLabel user_status_label = new JLabel("登录用户:"); user_status_label.setHorizontalAlignment(SwingConstants.CENTER); user_status_label.setForeground(Color.BLACK); user_status_label.setFont(new Font("微软雅黑", Font.PLAIN, 20)); user_status_label.setBackground(Color.LIGHT_GRAY); toolBar.add(user_status_label); user_menu = new JButton(""); user_menu.setForeground(Color.GREEN); user_menu.setFont(new Font("微软雅黑", Font.PLAIN, 22)); user_menu.setBackground(Color.BLACK); toolBar.add(user_menu); JLabel space_3 = new JLabel(" "); toolBar.add(space_3); JLabel space_4 = new JLabel(" "); toolBar.add(space_4); tabbedPane = new JTabbedPane(JTabbedPane.TOP); tabbedPane.setMinimumSize(new Dimension(400, 50)); tabbedPane.setFont(new Font("宋体", Font.BOLD, 22)); contentPane.add(tabbedPane); //首页 JPanel indexPanelA = new JPanel(); indexScrollPaneA = new JScrollPane(indexPanelA); indexPanelA.setLayout(null); // 工位1 product_sn_1 = new JTextField(); product_sn_1.setHorizontalAlignment(SwingConstants.CENTER); product_sn_1.setEditable(false); product_sn_1.setFont(new Font("微软雅黑", Font.PLAIN, 20)); product_sn_1.setBounds(0, 60, 489, 70); indexPanelA.add(product_sn_1); product_sn_1.setColumns(10); product_sn_1.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { createQRCode(product_sn_1.getText()); } }); f_scan_data_bt_1 = new JButton("扫码"); f_scan_data_bt_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { scanBarcode1();} }); f_scan_data_bt_1.setIcon(new ImageIcon(MesClient.class.getResource("/bg/scan_barcode.png"))); f_scan_data_bt_1.setFont(new Font("微软雅黑", Font.PLAIN, 32)); f_scan_data_bt_1.setBounds(280, 340, 171, 70); indexPanelA.add(f_scan_data_bt_1); finish_ok_bt_1 = new JButton("OK"); finish_ok_bt_1.setEnabled(false); finish_ok_bt_1.setIcon(new ImageIcon(MesClient.class.getResource("/bg/ok_bg.png"))); finish_ok_bt_1.setFont(new Font("微软雅黑", Font.PLAIN, 32)); finish_ok_bt_1.setBounds(0, 335, 125, 80); finish_ok_bt_1.setEnabled(false); indexPanelA.add(finish_ok_bt_1); finish_ng_bt_1 = new JButton("NG"); finish_ng_bt_1.setEnabled(false); finish_ng_bt_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {} }); finish_ng_bt_1.setIcon(new ImageIcon(MesClient.class.getResource("/bg/ng_bg.png"))); finish_ng_bt_1.setFont(new Font("微软雅黑", Font.PLAIN, 32)); finish_ng_bt_1.setBounds(128, 335, 125, 80); finish_ng_bt_1.setEnabled(false); indexPanelA.add(finish_ng_bt_1); status_menu_1 = new JButton("等待加工信号"); status_menu_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {} }); status_menu_1.setForeground(Color.GREEN); status_menu_1.setFont(new Font("微软雅黑", Font.PLAIN, 20)); status_menu_1.setBackground(Color.BLACK); status_menu_1.setBounds(100, 8, 340, 35); indexPanelA.add(status_menu_1); JLabel state_label_1 = new JLabel(Config.gw_1); state_label_1.setHorizontalAlignment(SwingConstants.LEFT); state_label_1.setForeground(Color.BLACK); state_label_1.setFont(new Font("微软雅黑", Font.PLAIN, 20)); state_label_1.setBackground(Color.LIGHT_GRAY); state_label_1.setBounds(0, 10, 150, 28); indexPanelA.add(state_label_1); JLabel lblNewLabel = new JLabel("压力"); lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT); lblNewLabel.setFont(new Font("微软雅黑", Font.PLAIN, 25)); lblNewLabel.setBounds(30, 160, 96, 53); indexPanelA.add(lblNewLabel); pressureText_1 = new JTextField(); pressureText_1.setFont(new Font("微软雅黑", Font.PLAIN, 25)); pressureText_1.setEnabled(false); pressureText_1.setForeground(Color.BLACK); pressureText_1.setBounds(150, 160, 191, 56); indexPanelA.add(pressureText_1); pressureText_1.setColumns(10); JLabel lblNewLabel_1 = new JLabel("泄漏"); lblNewLabel_1.setHorizontalAlignment(SwingConstants.RIGHT); lblNewLabel_1.setFont(new Font("微软雅黑", Font.PLAIN, 25)); lblNewLabel_1.setBounds(30, 235, 96, 53); indexPanelA.add(lblNewLabel_1); leakText_1 = new JTextField(); leakText_1.setFont(new Font("微软雅黑", Font.PLAIN, 25)); leakText_1.setEnabled(false); leakText_1.setColumns(10); leakText_1.setBounds(150, 235, 191, 56); indexPanelA.add(leakText_1); JLabel serialportStr1 = new JLabel("串口:"); serialportStr1.setHorizontalAlignment(SwingConstants.LEFT); serialportStr1.setFont(new Font("微软雅黑", Font.PLAIN, 22)); indexPanelA.add(serialportStr1); serialportStr1.setBounds(338, 490, 100, 45); // 下拉框 JComboBox comboBox1 = new JComboBox<>(new String[]{"COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "COM10", "COM11","COM12", "COM13", "COM14", "COM15", "COM16", "COM17", "COM18"}); comboBox1.setPreferredSize(new Dimension(90, 45)); comboBox1.setFont(new Font("微软雅黑", Font.PLAIN, 20)); // 设置初始化选中项 comboBox1.setSelectedItem(Config.portName1); // 添加监听 comboBox1.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { String selectedItem = (String) e.getItem(); if (e.getStateChange() == ItemEvent.SELECTED && !Objects.equals(selectedItem, currentSerialPort1)) { int option = JOptionPane.showConfirmDialog(mesClientFrame, "确定切换串口至" + selectedItem + "?", "切换串口", JOptionPane.OK_CANCEL_OPTION); if (option == JOptionPane.OK_OPTION) { // 用户确认切换 log.info("============用户切换{}串口至 {}==============", Config.gw_1, selectedItem); currentSerialPort1 = selectedItem; WorkTimer.ateq1.replaceSerialUtil(new SerialUtil(selectedItem)); resetScanA(); setMenuState_1("切换" + Config.gw_1 + "串口至" + selectedItem + ",请扫码", 0); log.info("=============切换{}串口成功===================", Config.gw_1); } else { // 用户取消切换,恢复之前的选项 comboBox1.setSelectedItem(currentSerialPort1); } } } }); comboBox1.setBounds(385, 490, 100, 45); indexPanelA.add(comboBox1); // 工位2 product_sn_2 = new JTextField(); product_sn_2.setHorizontalAlignment(SwingConstants.CENTER); product_sn_2.setEditable(false); product_sn_2.setFont(new Font("微软雅黑", Font.PLAIN, 20)); product_sn_2.setBounds(497, 60, 489, 70); indexPanelA.add(product_sn_2); product_sn_2.setColumns(10); product_sn_2.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { createQRCode(product_sn_2.getText()); } }); f_scan_data_bt_2 = new JButton("扫码"); f_scan_data_bt_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { scanBarcode2();} }); f_scan_data_bt_2.setIcon(new ImageIcon(MesClient.class.getResource("/bg/scan_barcode.png"))); f_scan_data_bt_2.setFont(new Font("微软雅黑", Font.PLAIN, 32)); f_scan_data_bt_2.setBounds(280+497, 340, 171, 70); indexPanelA.add(f_scan_data_bt_2); finish_ok_bt_2 = new JButton("OK"); finish_ok_bt_2.setEnabled(false); finish_ok_bt_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {} }); finish_ok_bt_2.setIcon(new ImageIcon(MesClient.class.getResource("/bg/ok_bg.png"))); finish_ok_bt_2.setFont(new Font("微软雅黑", Font.PLAIN, 32)); finish_ok_bt_2.setBounds(497, 335, 125, 80); finish_ok_bt_2.setEnabled(false); indexPanelA.add(finish_ok_bt_2); finish_ng_bt_2 = new JButton("NG"); finish_ng_bt_2.setEnabled(false); finish_ng_bt_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {} }); finish_ng_bt_2.setIcon(new ImageIcon(MesClient.class.getResource("/bg/ng_bg.png"))); finish_ng_bt_2.setFont(new Font("微软雅黑", Font.PLAIN, 32)); finish_ng_bt_2.setBounds(128 + 497, 335, 125, 80); finish_ng_bt_2.setEnabled(false); indexPanelA.add(finish_ng_bt_2); status_menu_2 = new JButton("等待加工信号"); status_menu_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); status_menu_2.setForeground(Color.GREEN); status_menu_2.setFont(new Font("微软雅黑", Font.PLAIN, 20)); status_menu_2.setBackground(Color.BLACK); status_menu_2.setBounds(100+497, 8, 340, 35); indexPanelA.add(status_menu_2); JLabel state_label_2 = new JLabel(Config.gw_2); state_label_2.setHorizontalAlignment(SwingConstants.LEFT); state_label_2.setForeground(Color.BLACK); state_label_2.setFont(new Font("微软雅黑", Font.PLAIN, 20)); state_label_2.setBackground(Color.LIGHT_GRAY); state_label_2.setBounds(497, 10, 150, 28); indexPanelA.add(state_label_2); JLabel lblNewLabel_2 = new JLabel("压力"); lblNewLabel_2.setHorizontalAlignment(SwingConstants.RIGHT); lblNewLabel_2.setFont(new Font("微软雅黑", Font.PLAIN, 25)); lblNewLabel_2.setBounds(530, 160, 96, 53); indexPanelA.add(lblNewLabel_2); pressureText_2 = new JTextField(); pressureText_2.setFont(new Font("微软雅黑", Font.PLAIN, 25)); pressureText_2.setEnabled(false); pressureText_2.setForeground(Color.BLACK); pressureText_2.setBounds(650, 160, 191, 56); indexPanelA.add(pressureText_2); pressureText_2.setColumns(10); JLabel lblNewLabel_3 = new JLabel("泄漏"); lblNewLabel_3.setHorizontalAlignment(SwingConstants.RIGHT); lblNewLabel_3.setFont(new Font("微软雅黑", Font.PLAIN, 25)); lblNewLabel_3.setBounds(530, 235, 96, 53); indexPanelA.add(lblNewLabel_3); leakText_2 = new JTextField(); leakText_2.setFont(new Font("微软雅黑", Font.PLAIN, 25)); leakText_2.setEnabled(false); leakText_2.setColumns(10); leakText_2.setBounds(650, 235, 191, 56); indexPanelA.add(leakText_2); JLabel serialportStr2 = new JLabel("串口:"); serialportStr2.setHorizontalAlignment(SwingConstants.LEFT); serialportStr2.setFont(new Font("微软雅黑", Font.PLAIN, 22)); indexPanelA.add(serialportStr2); serialportStr2.setBounds(838, 490, 100, 45); // 下拉框 JComboBox comboBox2 = new JComboBox<>(new String[]{"COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "COM10", "COM11","COM12","COM13", "COM14", "COM15", "COM16", "COM17", "COM18"}); comboBox2.setPreferredSize(new Dimension(90, 45)); comboBox2.setFont(new Font("微软雅黑", Font.PLAIN, 20)); // 设置初始化选中项 comboBox2.setSelectedItem(Config.portName2); // 添加监听 comboBox2.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { String selectedItem = (String) e.getItem(); if (e.getStateChange() == ItemEvent.SELECTED && !Objects.equals(selectedItem, currentSerialPort2)) { int option = JOptionPane.showConfirmDialog(mesClientFrame, "确定切换串口至" + selectedItem + "?", "切换串口", JOptionPane.OK_CANCEL_OPTION); if (option == JOptionPane.OK_OPTION) { // 用户确认切换 log.info("==============用户切换{}串口至 {}===============", Config.gw_2, selectedItem); currentSerialPort2 = selectedItem; WorkTimer.ateq2.replaceSerialUtil(new SerialUtil(selectedItem)); resetScanB(); setMenuState_2("切换" + Config.gw_2 + "串口至" + selectedItem + ",请扫码", 0); log.info("==============切换{}串口成功=====================", Config.gw_2); } else { // 用户取消切换,恢复之前的选项 comboBox2.setSelectedItem(currentSerialPort2); } } } }); comboBox2.setBounds(885, 490, 100, 45); indexPanelA.add(comboBox2); Panel panel1 = new Panel(); panel1.setEnabled(false); panel1.setBackground(SystemColor.activeCaptionBorder); panel1.setBounds(490, 0, 6, 600); indexPanelA.add(panel1); tabbedPane.addTab("工作面板", new ImageIcon(MesClient.class.getResource("/bg/a_side.png")), indexScrollPaneA, null); tabbedPane.setEnabledAt(0, true); indexPanelC = new JPanel(); searchScrollPaneDj = new JScrollPane(indexPanelC); indexPanelC.setLayout(null); tabbedPane.addTab("开班点检", new ImageIcon(MesClient.class.getResource("/bg/menu_data_preprocess.png")), searchScrollPaneDj, null); indexPanelB = new JPanel(); searchScrollPane = new JScrollPane(indexPanelB); indexPanelB.setLayout(null); tabbedPane.addTab("OP310B记录", new ImageIcon(MesClient.class.getResource("/bg/menu_data_preprocess.png")), searchScrollPane, null); panel5 = new JPanel(); scrollPane5 = new JScrollPane(panel5); panel5.setLayout(null); tabbedPane.addTab("OP320记录", new ImageIcon(MesClient.class.getResource("/bg/menu_data_preprocess.png")), scrollPane5, null); // 员工工作记录 panel4 = new JPanel(); scrollPane4 = new JScrollPane(panel4); panel4.setLayout(null); tabbedPane.addTab("人员记录", scrollPane4); tabbedPane.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { JTabbedPane tabbedPane = (JTabbedPane) e.getSource(); int selectedIndex = tabbedPane.getSelectedIndex(); if (selectedIndex == 1) { } } }); } public static void setMenuState_1(String msg, int error) { if (error == 0) { MesClient.status_menu_1.setForeground(Color.GREEN); } else { MesClient.status_menu_1.setForeground(Color.RED); } MesClient.status_menu_1.setText(msg); } public static void setMenuState_2(String msg, int error) { if (error == 0) { MesClient.status_menu_2.setForeground(Color.GREEN); } else { MesClient.status_menu_2.setForeground(Color.RED); } MesClient.status_menu_2.setText(msg); } public static void getMaterailData() { JSONObject retObj = DataUtil.getBindMaterail(); if (retObj.get("result") != null && retObj.get("result").toString().equalsIgnoreCase("true")) { java.util.List arrs = retObj.getList("data", BindMaterialResp.class); int i = 0; rowData = new Object[arrs.size()][7]; for (BindMaterialResp bindMaterialResp : arrs) { rowData[i][0] = bindMaterialResp.getMaterialTitle(); rowData[i][1] = bindMaterialResp.getBatchSn(); rowData[i][2] = bindMaterialResp.getLastTimes(); rowData[i][3] = ""; rowData[i][4] = bindMaterialResp.getCraft(); rowData[i][5] = bindMaterialResp.getMaterialId(); rowData[i][6] = bindMaterialResp.getType(); i++; } bindBatchPanel(); } } public static void updateMaterailData() { JSONObject retObj = DataUtil.getBindMaterail(); if (retObj.get("result") != null && retObj.get("result").toString().equalsIgnoreCase("true")) { List arrs = retObj.getList("data", BindMaterialResp.class); int i = 0; for (BindMaterialResp bindMaterialResp : arrs) { rowData[i][0] = bindMaterialResp.getMaterialTitle(); rowData[i][1] = bindMaterialResp.getBatchSn(); rowData[i][2] = bindMaterialResp.getLastTimes(); rowData[i][3] = ""; rowData[i][4] = bindMaterialResp.getCraft(); rowData[i][5] = bindMaterialResp.getMaterialId(); rowData[i][6] = bindMaterialResp.getType(); i++; } MesClient.table.repaint(); } } // 绑定物料批次码 public static void scanBatchSn(BindMaterialResp bindMaterialResp) { //弹窗扫工件码 String scanBarcodeTitle = "请扫物料:" + bindMaterialResp.getMaterialTitle(); String scanBarcode = JOptionPane.showInputDialog(null, scanBarcodeTitle); if (scanBarcode != null && !scanBarcode.equalsIgnoreCase("")) { JSONObject retObj = DataUtil.saveBindMaterail(scanBarcode, bindMaterialResp.getCraft(), bindMaterialResp.getMaterialId(), bindMaterialResp.getType()); if (retObj.get("result") != null && retObj.get("result").toString().equalsIgnoreCase("true")) { MesClient.setMenuState_1("扫物料:" + bindMaterialResp.getMaterialTitle() + "成功", 0); updateMaterailData(); } else { if (retObj.get("result") == null) { MesClient.setMenuState_1("请求失败,请重试", -1); } else { if (retObj.get("result").toString().equalsIgnoreCase("false")) { MesClient.setMenuState_1(retObj.getString("message"), -1); } } } } } public static void bindBatchPanel() { JPanel indexPanelBB = new JPanel(); JPanel panel = new JPanel(); panel.setBounds(0, 0, 990, 550); // panel.setBounds(81, 50, 810, 479); indexPanelBB.add(panel); panel.setLayout(new GridLayout(0, 1, 0, 0)); table = new JTable(rowData, columnNames) { public boolean isCellEditable(int row, int column) { if (column == 3) { return true; } return false; } }; table.setRowHeight(40); table.setEnabled(true); table.setFont(new Font("微软雅黑", Font.PLAIN, 14)); table.getColumnModel().getColumn(3).setCellRenderer(new TableCellRendererButton()); table.getColumnModel().getColumn(3).setCellEditor(new TableCellEditorButton()); JScrollPane scrollPane = new JScrollPane(table); panel.add(scrollPane); JScrollPane indexScrollPaneB = new JScrollPane(indexPanelBB); indexPanelBB.setLayout(null); tabbedPane.addTab("绑定物料", new ImageIcon(MesClient.class.getResource("/bg/menu_data_preprocess.png")), indexScrollPaneB, null); } }