package window; // °üÉùÃ÷
|
import java.awt.*; // µ¼ÈëAWT°ü
|
import java.sql.Connection; // µ¼ÈëÊý¾Ý¿âÁ¬½ÓÀà
|
import java.sql.ResultSet; // µ¼Èë½á¹û¼¯Àà
|
import java.sql.Statement; // µ¼ÈëSQLÓï¾äÀà
|
import javax.swing.*; // µ¼ÈëSwing°ü
|
import javax.swing.border.EmptyBorder; // µ¼Èë¿Õ±ß¿òÀà
|
import java.util.ResourceBundle; // µ¼Èë×ÊÔ´ÊøÀà
|
import udptcp.UDPPortAReceiver; // µ¼ÈëUDP¶Ë¿ÚA½ÓÊÕÆ÷
|
import udptcp.UDPPortBReceiver; // µ¼ÈëUDP¶Ë¿ÚB½ÓÊÕÆ÷
|
import javax.swing.plaf.basic.BasicInternalFrameUI; // µ¼Èë»ù´¡ÄÚ²¿¿ò¼ÜUI
|
|
public class WelcomeFrame extends JInternalFrame { // »¶Ó¿ò¼ÜÀà
|
private static final long serialVersionUID = 1L; // ÐòÁл¯°æ±¾ID
|
private ResourceBundle messages; // ÏûÏ¢×ÊÔ´Êø
|
private Connection conn; // Êý¾Ý¿âÁ¬½Ó
|
private Timer statsTimer; // ͳ¼Æ¶¨Ê±Æ÷
|
private JLabel udpAPacketCountLabel; // UDP¶Ë¿ÚA°ü¼ÆÊý±êÇ©
|
private JLabel udpBPacketCountLabel; // UDP¶Ë¿ÚB°ü¼ÆÊý±êÇ©
|
private JLabel memoryUsageLabel; // ÄÚ´æÊ¹ÓñêÇ©
|
private JLabel threadCountLabel; // Ï̼߳ÆÊý±êÇ©
|
|
public WelcomeFrame(ResourceBundle messages, Connection conn) { // ¹¹Ô캯Êý
|
super("", true, true, true, true); // µ÷Óø¸À๹Ô캯Êý£¬ÉèÖñêÌâΪ¿Õ
|
this.messages = messages; // ³õʼ»¯ÏûÏ¢×ÊÔ´Êø
|
this.conn = conn; // ³õʼ»¯Êý¾Ý¿âÁ¬½Ó
|
|
initializeFrame(); // ³õʼ»¯¿ò¼Ü
|
setContentPane(createWelcomePanel()); // ÉèÖÃÄÚÈÝÃæ°å
|
startStatsTimer(); // Æô¶¯Í³¼Æ¶¨Ê±Æ÷
|
}
|
|
private void initializeFrame() { // ³õʼ»¯¿ò¼Ü·½·¨
|
setSize(900, 700); // ÉèÖÿò¼Ü´óС
|
setLocation(100, 100); // ÉèÖÿò¼ÜλÖÃ
|
setMaximizable(true); // ÉèÖÿÉ×î´ó»¯
|
setIconifiable(true); // ÉèÖÿÉͼ±ê»¯
|
setClosable(true); // ÉèÖÿɹرÕ
|
setBorder(null); // ÒÆ³ý±ß¿ò
|
setVisible(true); // ÉèÖÿɼû
|
|
// ÒÆ³ý±êÌâÀ¸
|
BasicInternalFrameUI ui = (BasicInternalFrameUI) this.getUI(); // »ñÈ¡UI×é¼þ
|
ui.setNorthPane(null); // ÒÆ³ý±êÌâÀ¸
|
|
try {
|
setMaximum(true); // ³¢ÊÔ×î´ó»¯´°¿Ú
|
} catch (java.beans.PropertyVetoException e) {
|
e.printStackTrace(); // ´òÓ¡Òì³£¶ÑÕ»
|
}
|
}
|
|
private JPanel createWelcomePanel() { // ´´½¨»¶ÓÃæ°å·½·¨
|
JPanel panel = new BackgroundPanel(); // ´´½¨±³¾°Ãæ°å
|
panel.setLayout(new BorderLayout()); // ÉèÖñ߽粼¾Ö
|
panel.setBorder(new EmptyBorder(30, 30, 30, 30)); // ÉèÖÿձ߿ò
|
|
// ´´½¨±êÌâÃæ°å
|
JPanel titlePanel = new JPanel(new BorderLayout()); // ´´½¨±ß½ç²¼¾ÖÃæ°å
|
titlePanel.setOpaque(false); // ÉèÖÃ͸Ã÷
|
|
JLabel titleLabel = new JLabel(messages.getString("APP_NAME"), SwingConstants.CENTER); // ´´½¨Ó¦ÓÃÃû³Æ±êÇ©
|
titleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 42)); // ÉèÖÃ×ÖÌå
|
titleLabel.setForeground(new Color(25, 25, 112)); // ÉèÖÃǰ¾°É«
|
titleLabel.setBorder(new EmptyBorder(20, 0, 20, 0)); // ÉèÖÿձ߿ò
|
titleLabel.setOpaque(false); // ÉèÖÃ͸Ã÷
|
|
JLabel subtitleLabel = new JLabel(messages.getString("WELCOME_MSG"), SwingConstants.CENTER); // ´´½¨»¶ÓÏûÏ¢±êÇ©
|
subtitleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.ITALIC, 22)); // ÉèÖÃ×ÖÌå
|
subtitleLabel.setForeground(new Color(70, 130, 180)); // ÉèÖÃǰ¾°É«
|
subtitleLabel.setOpaque(false); // ÉèÖÃ͸Ã÷
|
|
titlePanel.add(titleLabel, BorderLayout.NORTH); // Ìí¼Ó±êÌâµ½±±²¿
|
titlePanel.add(subtitleLabel, BorderLayout.CENTER); // Ìí¼Ó¸±±êÌâµ½Öв¿
|
|
// ´´½¨ÐÅÏ¢Ãæ°å
|
JPanel infoPanel = new JPanel(new GridLayout(0, 2, 20, 20)); // ´´½¨Íø¸ñ²¼¾ÖÃæ°å
|
infoPanel.setBorder(new EmptyBorder(30, 50, 30, 50)); // ÉèÖÿձ߿ò
|
infoPanel.setBackground(new Color(255, 255, 255, 180)); // ÉèÖðë͸Ã÷°×É«±³¾°
|
infoPanel.setOpaque(true); // ÉèÖò»Í¸Ã÷
|
|
// Ìí¼Óϵͳ״̬ÐÅÏ¢
|
infoPanel.add(createInfoLabel(messages.getString("SYSTEM_STATUS"),
|
messages.getString("RUNNING_NORMAL"),
|
new Color(0, 100, 0))); // ÉîÂÌÉ«
|
|
// Ìí¼ÓÊý¾Ý¿âÁ¬½ÓÐÅÏ¢
|
infoPanel.add(createInfoLabel(messages.getString("DB_CONNECTION"),
|
conn != null ? messages.getString("CONNECTED") : messages.getString("DISCONNECTED"),
|
conn != null ? new Color(0, 100, 0) : Color.RED)); // Á¬½Ó³É¹¦ÂÌÉ«/ʧ°ÜºìÉ«
|
|
try {
|
if (conn != null) { // ¼ì²éÊý¾Ý¿âÁ¬½Ó
|
try (Statement stmt = conn.createStatement(); // ´´½¨Óï¾ä
|
ResultSet rs = stmt.executeQuery("SELECT VERSION()")) { // Ö´Ðа汾²éѯ
|
if (rs.next()) { // Èç¹ûÓнá¹û
|
infoPanel.add(createInfoLabel(messages.getString("DB_VERSION"),
|
rs.getString(1),
|
new Color(25, 25, 112))); // Ìí¼ÓÊý¾Ý¿â°æ±¾
|
}
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace(); // ´òÓ¡Òì³£
|
}
|
|
// Ìí¼Óµ±Ç°Óû§ÐÅÏ¢
|
infoPanel.add(createInfoLabel(messages.getString("CURRENT_USER"),
|
messages.getString("ADMIN"),
|
new Color(25, 25, 112))); // ÉîÀ¶É«
|
|
// Ìí¼Óϵͳʱ¼äÐÅÏ¢
|
infoPanel.add(createInfoLabel(messages.getString("SYSTEM_TIME"),
|
new java.util.Date().toString(),
|
new Color(25, 25, 112))); // ÉîÀ¶É«
|
|
// Ìí¼ÓUDP¶Ë¿ÚAͳ¼Æ
|
infoPanel.add(createInfoLabel(messages.getString("UDP_PORT_A"), "0", new Color(178, 34, 34))); // שºìÉ«
|
udpAPacketCountLabel = createInfoLabel("", "", new Color(178, 34, 34)); // ´´½¨¼ÆÊý±êÇ©
|
infoPanel.add(udpAPacketCountLabel); // Ìí¼Ó¼ÆÊý±êÇ©
|
|
// Ìí¼ÓUDP¶Ë¿ÚBͳ¼Æ
|
infoPanel.add(createInfoLabel(messages.getString("UDP_PORT_B"), "0", new Color(178, 34, 34))); // שºìÉ«
|
udpBPacketCountLabel = createInfoLabel("", "", new Color(178, 34, 34)); // ´´½¨¼ÆÊý±êÇ©
|
infoPanel.add(udpBPacketCountLabel); // Ìí¼Ó¼ÆÊý±êÇ©
|
|
// Ìí¼ÓÄÚ´æÊ¹ÓÃͳ¼Æ
|
infoPanel.add(createInfoLabel(messages.getString("MEMORY_USAGE"), "", new Color(148, 0, 211))); // ×ÏÂÞÀ¼É«
|
memoryUsageLabel = createInfoLabel("", "", new Color(148, 0, 211)); // ´´½¨ÄÚ´æ±êÇ©
|
infoPanel.add(memoryUsageLabel); // Ìí¼ÓÄÚ´æ±êÇ©
|
|
// Ìí¼ÓÏ̼߳ÆÊýͳ¼Æ
|
infoPanel.add(createInfoLabel(messages.getString("THREAD_COUNT"), "", new Color(148, 0, 211))); // ×ÏÂÞÀ¼É«
|
threadCountLabel = createInfoLabel("", "", new Color(148, 0, 211)); // ´´½¨Ï̱߳êÇ©
|
infoPanel.add(threadCountLabel); // Ìí¼ÓÏ̱߳êÇ©
|
|
// ´´½¨×´Ì¬Ãæ°å
|
JPanel statsPanel = new JPanel(new GridLayout(1, 4, 15, 15)); // ´´½¨Íø¸ñ²¼¾ÖÃæ°å
|
statsPanel.setBorder(new EmptyBorder(20, 50, 10, 50)); // ÉèÖÿձ߿ò
|
statsPanel.setOpaque(false); // ÉèÖÃ͸Ã÷
|
|
// Ìí¼Óͳ¼ÆºÐ×Ó
|
statsPanel.add(createStatBox(messages.getString("UDP_PORT_A_STAT"), udpAPacketCountLabel)); // UDP¶Ë¿ÚAͳ¼Æ
|
statsPanel.add(createStatBox(messages.getString("UDP_PORT_B_STAT"), udpBPacketCountLabel)); // UDP¶Ë¿ÚBͳ¼Æ
|
statsPanel.add(createStatBox(messages.getString("MEMORY_USAGE_STAT"), memoryUsageLabel)); // ÄÚ´æÊ¹ÓÃͳ¼Æ
|
statsPanel.add(createStatBox(messages.getString("THREAD_COUNT_STAT"), threadCountLabel)); // Ï̼߳ÆÊýͳ¼Æ
|
|
// ×é×°Ö÷Ãæ°å
|
panel.add(titlePanel, BorderLayout.NORTH); // Ìí¼Ó±êÌâÃæ°åµ½±±²¿
|
panel.add(infoPanel, BorderLayout.CENTER); // Ìí¼ÓÐÅÏ¢Ãæ°åµ½Öв¿
|
panel.add(statsPanel, BorderLayout.SOUTH); // Ìí¼Ó×´Ì¬Ãæ°åµ½Äϲ¿
|
|
return panel; // ·µ»ØÃæ°å
|
}
|
|
private JLabel createInfoLabel(String title, String value, Color color) { // ´´½¨ÐÅÏ¢±êÇ©·½·¨
|
JLabel label = new JLabel("<html><div style='text-align:center;'><b>" + title + "</b><br>" + value + "</div></html>"); // ´´½¨´øHTML¸ñʽµÄ±êÇ©
|
label.setFont(new Font(messages.getString("FONT_NAME"), Font.PLAIN, 16)); // ÉèÖÃ×ÖÌå
|
label.setForeground(color); // ÉèÖÃǰ¾°É«
|
label.setHorizontalAlignment(SwingConstants.CENTER); // ÉèÖÃˮƽ¾ÓÖÐ
|
label.setVerticalAlignment(SwingConstants.CENTER); // ÉèÖô¹Ö±¾ÓÖÐ
|
label.setOpaque(false); // ÉèÖÃ͸Ã÷
|
return label; // ·µ»Ø±êÇ©
|
}
|
|
private JPanel createStatBox(String title, JLabel valueLabel) { // ´´½¨Í³¼ÆºÐ×Ó·½·¨
|
JPanel boxPanel = new JPanel(new BorderLayout()); // ´´½¨±ß½ç²¼¾ÖÃæ°å
|
boxPanel.setBorder(BorderFactory.createCompoundBorder( // ÉèÖø´ºÏ±ß¿ò
|
BorderFactory.createLineBorder(new Color(70, 130, 180), 2), // À¶É«±ß¿ò
|
new EmptyBorder(15, 10, 15, 10) // Äڱ߾à
|
));
|
boxPanel.setBackground(new Color(240, 248, 255, 220)); // ÉèÖðë͸Ã÷±³¾°
|
boxPanel.setOpaque(true); // ÉèÖò»Í¸Ã÷
|
|
JLabel titleLabel = new JLabel(title, SwingConstants.CENTER); // ´´½¨±êÌâ±êÇ©
|
titleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18)); // ÉèÖôÖÌå
|
titleLabel.setForeground(new Color(25, 25, 112)); // ÉèÖÃÉîÀ¶É«
|
|
valueLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 24)); // ÉèÖôÖÌå´ó×ÖºÅ
|
valueLabel.setHorizontalAlignment(SwingConstants.CENTER); // ÉèÖþÓÖÐ
|
|
boxPanel.add(titleLabel, BorderLayout.NORTH); // Ìí¼Ó±êÌâµ½±±²¿
|
boxPanel.add(valueLabel, BorderLayout.CENTER); // Ìí¼ÓÖµ±êÇ©µ½Öв¿
|
|
return boxPanel; // ·µ»ØÃæ°å
|
}
|
|
private void startStatsTimer() { // Æô¶¯Í³¼Æ¶¨Ê±Æ÷·½·¨
|
statsTimer = new Timer(1000, e -> { // ´´½¨1Ãë¼ä¸ôµÄ¶¨Ê±Æ÷
|
// ¸üÐÂUDPÊý¾Ý°ü¼ÆÊý
|
udpAPacketCountLabel.setText(String.valueOf(UDPPortAReceiver.getPacketCount())); // ¸üж˿ÚA¼ÆÊý
|
udpBPacketCountLabel.setText(String.valueOf(UDPPortBReceiver.getPacketCount())); // ¸üж˿ÚB¼ÆÊý
|
|
// ¸üÐÂÄÚ´æÊ¹ÓÃÇé¿ö
|
Runtime runtime = Runtime.getRuntime(); // »ñÈ¡ÔËÐÐʱʵÀý
|
long usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024); // ¼ÆËãÒÑÓÃÄÚ´æ(MB)
|
long maxMemory = runtime.maxMemory() / (1024 * 1024); // ¼ÆËã×î´óÄÚ´æ(MB)
|
memoryUsageLabel.setText(usedMemory + " " + messages.getString("MB") + " / " + maxMemory + " " + messages.getString("MB")); // ÉèÖÃÄÚ´æÎı¾
|
|
// ¸üÐÂÏß³ÌÊýÁ¿
|
threadCountLabel.setText(String.valueOf(Thread.activeCount())); // ÉèÖûÏß³ÌÊý
|
});
|
statsTimer.start(); // Æô¶¯¶¨Ê±Æ÷
|
}
|
|
@Override
|
public void dispose() { // Ïú»Ù·½·¨
|
super.dispose(); // µ÷Óø¸ÀàÏú»Ù
|
if (statsTimer != null) { // ¼ì²é¶¨Ê±Æ÷
|
statsTimer.stop(); // Í£Ö¹¶¨Ê±Æ÷
|
}
|
}
|
}
|