package home;
|
import javax.swing.*;
|
import java.awt.*;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
|
public class SendPanel extends JPanel {
|
/**
|
*
|
*/
|
private static final long serialVersionUID = 1L;
|
private MainFrame mainFrame;
|
private JTextArea sendArea;
|
private JCheckBox hexSendCheck, loopSendCheck;
|
private JTextField loopTimeField;
|
private JButton sendBtn, extensionBtn;
|
private JLabel loopTimeLabel; // 添加循环时间标签引用
|
private JLabel addressLabel; // 添加地址标签引用
|
private JTextField addressField; // 添加地址文本框引用
|
|
public SendPanel(MainFrame mainFrame) {
|
this.mainFrame = mainFrame;
|
initializeUI();
|
}
|
|
private void initializeUI() {
|
setLayout(new BorderLayout()); // 设置边界布局
|
setBorder(BorderFactory.createTitledBorder(getString("send.data"))); // 设置带标题的边框
|
|
// 创建顶部控制面板
|
JPanel topControlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 顶部控制面板,左对齐流式布局
|
hexSendCheck = new JCheckBox(getString("hex.send")); // HEX发送复选框
|
loopSendCheck = new JCheckBox(getString("loop.send")); // 循环发送复选框
|
loopTimeLabel = new JLabel(getString("loop.time")); // 循环时间标签
|
loopTimeField = new JTextField(8); // 循环时间文本框
|
loopTimeField.setText("1000"); // 设置默认循环时间
|
extensionBtn = ButtonUtils.createBlueButton(getString("extension"), 25); // 扩展按钮,高度25像素
|
extensionBtn.setPreferredSize(new Dimension(80, 25)); // 设置按钮宽度为120,高度25
|
// 在 SendPanel 的 initializeUI() 方法中,创建 extensionBtn 后添加:
|
extensionBtn.addActionListener(new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
ExtensionPanel extensionPanel = new ExtensionPanel(mainFrame);
|
extensionPanel.setVisible(true);
|
}
|
});
|
topControlPanel.add(hexSendCheck); // 添加HEX发送复选框
|
topControlPanel.add(loopSendCheck); // 添加循环发送复选框
|
topControlPanel.add(loopTimeLabel); // 添加循环时间标签
|
topControlPanel.add(loopTimeField); // 添加循环时间文本框
|
topControlPanel.add(extensionBtn); // 添加扩展按钮
|
|
// 创建中部控制面板(指定地址发送)
|
JPanel middleControlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 中部控制面板,左对齐流式布局
|
addressLabel = new JLabel(getString("specified.address")); // 指定地址标签
|
addressField = new JTextField(30); // 指定地址文本框
|
middleControlPanel.add(addressLabel); // 添加指定地址标签
|
middleControlPanel.add(addressField); // 添加指定地址文本框
|
|
// 创建发送区域面板
|
JPanel sendAreaPanel = new JPanel(new BorderLayout()); // 发送区域面板,边界布局
|
sendArea = new JTextArea(3, 25); // 发送文本区域
|
JScrollPane scrollPane = new JScrollPane(sendArea); // 发送区域滚动面板
|
sendAreaPanel.add(scrollPane, BorderLayout.CENTER); // 添加滚动面板到中心
|
|
// 创建底部控制面板(发送按钮)
|
JPanel bottomControlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 底部控制面板,左对齐流式布局
|
sendBtn = ButtonUtils.createBlueButton(getString("send"), 25); // 发送按钮,高度25像素
|
sendBtn.setPreferredSize(new Dimension(100, 25)); // 设置按钮宽度为120,高度25
|
|
// 添加发送按钮点击事件
|
sendBtn.addActionListener(new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
sendData();
|
}
|
});
|
|
bottomControlPanel.add(sendBtn); // 添加发送按钮
|
|
// 创建主面板,使用垂直盒子布局
|
JPanel mainPanel = new JPanel();
|
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); // 垂直盒子布局
|
|
mainPanel.add(topControlPanel); // 添加顶部控制面板
|
mainPanel.add(middleControlPanel); // 添加中部控制面板
|
mainPanel.add(sendAreaPanel); // 添加发送区域面板
|
mainPanel.add(bottomControlPanel); // 添加底部控制面板
|
|
add(mainPanel, BorderLayout.CENTER); // 添加主面板到中心
|
}
|
|
/**
|
* 发送数据并在数据日志中显示
|
*/
|
private void sendData() {
|
String sendContent = sendArea.getText().trim();
|
if (sendContent.isEmpty()) {
|
JOptionPane.showMessageDialog(this,
|
getString("send.content.empty"),
|
getString("prompt"),
|
JOptionPane.WARNING_MESSAGE);
|
return;
|
}
|
|
// 获取当前时间
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
String currentTime = dateFormat.format(new Date());
|
|
// 构建日志信息
|
StringBuilder logMessage = new StringBuilder();
|
logMessage.append("[").append(currentTime).append("] ");
|
logMessage.append(getString("send")).append(": ");
|
|
// 根据HEX发送选项格式化内容
|
if (hexSendCheck.isSelected()) {
|
logMessage.append("HEX ");
|
// 这里可以添加HEX格式转换逻辑
|
logMessage.append(sendContent);
|
} else {
|
logMessage.append("ASCII ");
|
logMessage.append(sendContent);
|
}
|
|
// 如果有指定地址,添加到日志中
|
String address = addressField.getText().trim();
|
if (!address.isEmpty()) {
|
logMessage.append(" [").append(getString("specified.address")).append(": ").append(address).append("]");
|
}
|
|
logMessage.append("\n");
|
|
// 将发送信息添加到数据日志面板
|
DataLogPanel dataLogPanel = mainFrame.getDataLogPanel();
|
if (dataLogPanel != null) {
|
// 通过反射或其他方式访问DataLogPanel的logArea
|
// 这里假设DataLogPanel有添加日志的方法
|
addLogToDataLogPanel(dataLogPanel, logMessage.toString());
|
}
|
|
// 这里可以添加实际的发送逻辑
|
|
}
|
|
/**
|
* 将日志信息添加到数据日志面板
|
* @param dataLogPanel 数据日志面板
|
* @param logMessage 日志信息
|
*/
|
private void addLogToDataLogPanel(DataLogPanel dataLogPanel, String logMessage) {
|
try {
|
// 使用反射获取logArea并添加日志
|
java.lang.reflect.Field logAreaField = DataLogPanel.class.getDeclaredField("logArea");
|
logAreaField.setAccessible(true);
|
JTextArea logArea = (JTextArea) logAreaField.get(dataLogPanel);
|
|
if (logArea != null) {
|
logArea.append(logMessage);
|
// 自动滚动到最后
|
logArea.setCaretPosition(logArea.getDocument().getLength());
|
}
|
} catch (Exception ex) {
|
// 如果反射失败,尝试其他方式
|
System.err.println("无法访问数据日志区域: " + ex.getMessage());
|
// 这里可以添加备用方案
|
}
|
}
|
|
public void updateLanguage() {
|
setBorder(BorderFactory.createTitledBorder(getString("send.data"))); // 更新边框标题
|
hexSendCheck.setText(getString("hex.send")); // 更新HEX发送复选框文本
|
loopSendCheck.setText(getString("loop.send")); // 更新循环发送复选框文本
|
sendBtn.setText(getString("send")); // 更新发送按钮文本
|
extensionBtn.setText(getString("extension")); // 更新扩展按钮文本
|
|
// 直接更新标签文本,无需遍历查找
|
if (loopTimeLabel != null) {
|
loopTimeLabel.setText(getString("loop.time")); // 更新循环时间标签文本
|
}
|
|
// 更新指定地址标签
|
if (addressLabel != null) {
|
addressLabel.setText(getString("specified.address")); // 更新指定地址标签文本
|
}
|
|
revalidate(); // 重新验证布局
|
repaint(); // 重新绘制
|
}
|
|
private String getString(String key) {
|
return mainFrame.getString(key); // 从主框架获取字符串
|
}
|
|
/**
|
* 获取发送区域内容
|
* @return 发送内容
|
*/
|
public String getSendContent() {
|
return sendArea.getText();
|
}
|
|
/**
|
* 设置发送区域内容
|
* @param content 发送内容
|
*/
|
public void setSendContent(String content) {
|
sendArea.setText(content);
|
}
|
|
/**
|
* 获取HEX发送状态
|
* @return 是否HEX发送
|
*/
|
public boolean isHexSend() {
|
return hexSendCheck.isSelected();
|
}
|
|
/**
|
* 获取循环发送状态
|
* @return 是否循环发送
|
*/
|
public boolean isLoopSend() {
|
return loopSendCheck.isSelected();
|
}
|
|
/**
|
* 获取循环时间
|
* @return 循环时间(毫秒)
|
*/
|
public int getLoopTime() {
|
try {
|
return Integer.parseInt(loopTimeField.getText());
|
} catch (NumberFormatException e) {
|
return 1000; // 默认1秒
|
}
|
}
|
}
|