张世豪
昨天 ef78717c5b956a26b360de44f774fc2b804296c2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
package xitongshezhi;
 
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.Properties;
 
@SuppressWarnings("serial")
public class lishijilu extends JDialog {
    // 屏幕尺寸常量 - 适配7寸竖屏
    private static final int SCREEN_WIDTH = 480;
    private static final int SCREEN_HEIGHT = 800;
    
    // 颜色常量 - 统一使用kacaoguanli.java中的颜色定义
    private static final Color PRIMARY_COLOR = new Color(52, 152, 219);
    private static final Color DARK_COLOR = new Color(15, 28, 48);
    private static final Color DARK_LIGHT_COLOR = new Color(26, 43, 68);
    private static final Color TEXT_COLOR = new Color(224, 224, 224);
    private static final Color TEXT_LIGHT_COLOR = new Color(160, 200, 255);
    
    private JPanel mainPanel;
    private JLabel titleLabel;
    private JButton backButton;
    
    // 文本域组件
    private JScrollPane textScrollPane;
    private JTextArea contentTextArea;
    
    public lishijilu(JFrame parent) {
        super(parent, "", true);
        initializeUI();
        setupEventListeners();
        loadLogContent(); // 加载日志内容
    }
 
    private void initializeUI() {
        // 设置对话框属性
        setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(getParent());
        setResizable(false);
        
        // 设置系统外观
        try {
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        // 主面板
        mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());
        mainPanel.setBackground(DARK_COLOR);
        mainPanel.setOpaque(true);
        mainPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
        
        // 创建顶部标题栏
        JPanel headerPanel = createHeaderPanel();
        
        // 创建文本区域
        JPanel contentPanel = createContentPanel();
        
        mainPanel.add(headerPanel, BorderLayout.NORTH);
        mainPanel.add(contentPanel, BorderLayout.CENTER);
        
        getContentPane().add(mainPanel);
    }
    
    private JPanel createHeaderPanel() {
        JPanel headerPanel = new JPanel(new BorderLayout());
        headerPanel.setOpaque(false);
        headerPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 12, 0));
        
        // 标题
        titleLabel = new JLabel("历史记录");
        titleLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 22));
        titleLabel.setForeground(TEXT_COLOR);
        
        // 返回按钮 - 使用不透明设计
        backButton = new JButton("关闭");
        backButton.setFont(new Font("Microsoft YaHei", Font.PLAIN, 14));
        backButton.setBackground(PRIMARY_COLOR);
        backButton.setForeground(Color.WHITE);
        backButton.setOpaque(true);
        backButton.setFocusPainted(false);
        backButton.setBorder(BorderFactory.createEmptyBorder(8, 16, 8, 16));
        backButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        
        // 返回按钮悬停效果
        backButton.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                backButton.setBackground(brighterColor(PRIMARY_COLOR));
            }
            
            public void mouseExited(java.awt.event.MouseEvent evt) {
                backButton.setBackground(PRIMARY_COLOR);
            }
        });
        
        JPanel titlePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        titlePanel.setOpaque(false);
        titlePanel.add(titleLabel);
        
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.setOpaque(false);
        buttonPanel.add(backButton);
        
        headerPanel.add(titlePanel, BorderLayout.WEST);
        headerPanel.add(buttonPanel, BorderLayout.EAST);
        
        return headerPanel;
    }
    
    private JPanel createContentPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBackground(DARK_LIGHT_COLOR);
        panel.setOpaque(true);
        panel.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createLineBorder(new Color(52, 152, 219, 26)),
            BorderFactory.createEmptyBorder(12, 12, 12, 12)
        ));
        
        // 内容标题
        JPanel contentHeader = new JPanel(new BorderLayout());
        contentHeader.setOpaque(false);
        contentHeader.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(255, 255, 255, 26)),
            BorderFactory.createEmptyBorder(0, 0, 8, 0)
        ));
        
        JLabel contentTitle = new JLabel("日志内容");
        contentTitle.setFont(new Font("Microsoft YaHei", Font.BOLD, 14));
        contentTitle.setForeground(TEXT_COLOR);
        
        contentHeader.add(contentTitle, BorderLayout.WEST);
        
        // 创建文本域
        contentTextArea = new JTextArea();
        contentTextArea.setEditable(false);
        contentTextArea.setBackground(DARK_LIGHT_COLOR);
        contentTextArea.setForeground(TEXT_COLOR);
        contentTextArea.setFont(new Font("宋体", Font.PLAIN, 12));
        contentTextArea.setLineWrap(true);
        contentTextArea.setWrapStyleWord(true);
        contentTextArea.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
        
        // 创建滚动面板
        textScrollPane = new JScrollPane(contentTextArea);
        textScrollPane.setBorder(BorderFactory.createEmptyBorder());
        textScrollPane.getVerticalScrollBar().setUnitIncrement(16);
        textScrollPane.setOpaque(false);
        textScrollPane.getViewport().setOpaque(false);
        
        // 底部信息栏
        JPanel footerPanel = new JPanel(new BorderLayout());
        footerPanel.setBackground(DARK_LIGHT_COLOR);
        footerPanel.setOpaque(true);
        footerPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, new Color(255, 255, 255, 25)));
        footerPanel.setPreferredSize(new Dimension(432, 30));
        
        JLabel noteLabel = new JLabel("最多保留最近1000条记录");
        noteLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 11));
        noteLabel.setForeground(TEXT_LIGHT_COLOR);
        noteLabel.setOpaque(false);
        
        footerPanel.add(noteLabel, BorderLayout.EAST);
        
        panel.add(contentHeader, BorderLayout.NORTH);
        panel.add(textScrollPane, BorderLayout.CENTER);
        panel.add(footerPanel, BorderLayout.SOUTH);
        
        return panel;
    }
    
    private void setupEventListeners() {
        // 返回按钮
        backButton.addActionListener(e -> {
            dispose();
        });
    }
    
    // 加载日志内容
    private void loadLogContent() {
        File logFile = new File("log.properties");
        
        if (!logFile.exists()) {
            contentTextArea.setText("日志文件不存在。");
            return;
        }
        
        Properties logProps = new Properties();
        try (FileInputStream in = new FileInputStream(logFile)) {
            logProps.load(in);
            
            // 检查记录数量,如果超过1000条则删除旧记录
            if (logProps.size() > 1000) {
                trimLogProperties(logProps);
            }
            
            // 构建显示内容
            StringBuilder content = new StringBuilder();
            content.append("日志文件内容 (").append(logProps.size()).append(" 条记录):\n\n");
            
            // 按时间戳排序显示
            logProps.stringPropertyNames().stream()
                .sorted((a, b) -> Long.compare(Long.parseLong(b), Long.parseLong(a)))
                .forEach(key -> {
                    String value = logProps.getProperty(key);
                    content.append("时间戳: ").append(key).append("\n");
                    content.append("内容: ").append(value).append("\n");
                    content.append("----------------------------------------\n");
                });
            
            contentTextArea.setText(content.toString());
            
        } catch (IOException e) {
            e.printStackTrace();
            contentTextArea.setText("加载日志文件时出错: " + e.getMessage());
        } catch (NumberFormatException e) {
            contentTextArea.setText("日志文件格式错误。");
        }
    }
    
    // 修剪日志属性,只保留最新的1000条记录
    private void trimLogProperties(Properties logProps) {
        // 按时间戳排序,保留最新的1000条
        logProps.stringPropertyNames().stream()
            .sorted((a, b) -> Long.compare(Long.parseLong(b), Long.parseLong(a)))
            .skip(1000)
            .forEach(logProps::remove);
        
        // 保存修剪后的属性
        try (FileOutputStream out = new FileOutputStream("log.properties")) {
            logProps.store(out, "UWB人员定位卡发卡机历史记录 - 自动修剪至1000条记录");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    // 新增辅助方法:使颜色更亮
    private Color brighterColor(Color color) {
        int r = Math.min(255, color.getRed() + 30);
        int g = Math.min(255, color.getGreen() + 30);
        int b = Math.min(255, color.getBlue() + 30);
        return new Color(r, g, b);
    }
    
    // 静态方法:从其他页面调用
    public static void showHistoryDialog(JFrame parent) {
        SwingUtilities.invokeLater(() -> {
            lishijilu dialog = new lishijilu(parent);
            dialog.setVisible(true);
        });
    }    
   
}