package xitongshezhi;
|
|
import java.awt.BorderLayout;
|
import java.awt.Color;
|
import java.awt.Cursor;
|
import java.awt.FlowLayout;
|
import java.awt.Font;
|
import java.awt.Frame;
|
import java.io.File;
|
|
import javax.sound.sampled.AudioInputStream;
|
import javax.sound.sampled.AudioSystem;
|
import javax.sound.sampled.Clip;
|
import javax.swing.BorderFactory;
|
import javax.swing.JButton;
|
import javax.swing.JDialog;
|
import javax.swing.JLabel;
|
import javax.swing.JPanel;
|
import javax.swing.SwingConstants;
|
import javax.swing.SwingUtilities;
|
import javax.swing.border.EmptyBorder;
|
|
/**
|
* 定时关闭对话框
|
* 使用静态方法避免内存泄漏
|
*/
|
public class Dingshidialog {
|
|
/**
|
* 显示定时关闭对话框
|
* @param parent 父窗口
|
* @param countdownTime 倒计时时间(秒)
|
* @param message 提示信息
|
* @param audioFile MP3文件名(根目录下,无需扩展名)
|
* @return 1-成功 0-失败
|
*/
|
public static int showTimedDialog(Frame parent, int countdownTime, String message, String audioFile) {
|
TimedDialog dialog = new TimedDialog(parent, countdownTime, message, audioFile);
|
return dialog.showDialog();
|
}
|
|
/**
|
* 内部对话框类,确保使用后能被垃圾回收
|
*/
|
@SuppressWarnings("serial")
|
private static class TimedDialog extends JDialog {
|
private JLabel countdownLabel;
|
private int remainingTime;
|
private int result = 0;
|
private Clip audioClip;
|
private volatile boolean running = true;
|
|
public TimedDialog(Frame parent, int countdownTime, String message, String audioFile) {
|
super(parent, "", true);
|
this.remainingTime = countdownTime;
|
initializeUI(message);
|
startCountdown();
|
playAudio(audioFile);
|
}
|
|
private void initializeUI(String message) {
|
// 设置对话框属性
|
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
setResizable(false);
|
|
// 创建主面板 - 使用不透明背景
|
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
|
mainPanel.setBackground(new Color(15, 28, 48));
|
mainPanel.setBorder(new EmptyBorder(25, 30, 25, 30));
|
mainPanel.setOpaque(true);
|
|
// 创建标题区域
|
JLabel titleLabel = new JLabel("");
|
titleLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 20));
|
titleLabel.setForeground(new Color(52, 152, 219));
|
titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
titleLabel.setBorder(new EmptyBorder(0, 0, 15, 0));
|
|
// 创建消息区域面板
|
JPanel messagePanel = new JPanel(new BorderLayout(10, 10));
|
messagePanel.setBackground(new Color(15, 28, 48));
|
messagePanel.setOpaque(true);
|
messagePanel.setBorder(new EmptyBorder(10, 0, 10, 0));
|
|
// 创建消息标签
|
JLabel messageLabel = new JLabel("<html><div style='text-align: center; width: 300px;'>" + message + "</div></html>");
|
messageLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 20));
|
messageLabel.setForeground(new Color(52, 152, 219));
|
messageLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
|
// 创建倒计时标签
|
countdownLabel = new JLabel("剩余时间: " + remainingTime + "秒");
|
countdownLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 16));
|
countdownLabel.setForeground(new Color(231, 76, 60));
|
countdownLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
countdownLabel.setBorder(new EmptyBorder(15, 0, 0, 0));
|
|
// 组装消息区域
|
messagePanel.add(messageLabel, BorderLayout.CENTER);
|
messagePanel.add(countdownLabel, BorderLayout.SOUTH);
|
|
// 创建按钮面板
|
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 0));
|
buttonPanel.setBackground(new Color(15, 28, 48));
|
buttonPanel.setOpaque(true);
|
buttonPanel.setBorder(new EmptyBorder(15, 0, 0, 0));
|
|
// 创建立即关闭按钮
|
JButton closeButton = createStyledButton("立即关闭", new Color(231, 76, 60));
|
buttonPanel.add(closeButton);
|
|
// 组装主面板
|
mainPanel.add(titleLabel, BorderLayout.NORTH);
|
mainPanel.add(messagePanel, BorderLayout.CENTER);
|
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
|
// 设置对话框内容
|
getContentPane().setBackground(new Color(15, 28, 48));
|
getContentPane().add(mainPanel);
|
pack();
|
setLocationRelativeTo(getParent());
|
|
// 按钮事件处理
|
closeButton.addActionListener(e -> {
|
result = 1;
|
disposeDialog();
|
});
|
|
// 对话框关闭事件
|
addWindowListener(new java.awt.event.WindowAdapter() {
|
@Override
|
public void windowClosing(java.awt.event.WindowEvent e) {
|
disposeDialog();
|
}
|
});
|
}
|
|
/**
|
* 开始倒计时
|
*/
|
private void startCountdown() {
|
Thread countdownThread = new Thread(() -> {
|
try {
|
while (running && remainingTime > 0) {
|
Thread.sleep(1000);
|
remainingTime--;
|
|
SwingUtilities.invokeLater(() -> {
|
if (countdownLabel != null) {
|
countdownLabel.setText("剩余时间: " + remainingTime + "秒");
|
}
|
});
|
|
if (remainingTime <= 0) {
|
SwingUtilities.invokeLater(() -> {
|
result = 1;
|
disposeDialog();
|
});
|
break;
|
}
|
}
|
} catch (InterruptedException e) {
|
Thread.currentThread().interrupt();
|
}
|
});
|
countdownThread.setDaemon(true);
|
countdownThread.start();
|
}
|
|
/**
|
* 播放音频文件
|
*/
|
private void playAudio(String audioFileName) {
|
if (audioFileName == null || audioFileName.trim().isEmpty()) {
|
return;
|
}
|
|
try {
|
String filePath = audioFileName.endsWith(".mp3") ? audioFileName : audioFileName + ".mp3";
|
File audioFile = new File(filePath);
|
|
if (!audioFile.exists()) {
|
System.err.println("音频文件不存在: " + audioFile.getAbsolutePath());
|
return;
|
}
|
|
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(audioFile);
|
audioClip = AudioSystem.getClip();
|
audioClip.open(audioInputStream);
|
audioClip.start();
|
|
} catch (Exception e) {
|
System.err.println("播放音频失败: " + e.getMessage());
|
// 实际项目中应使用支持MP3的库
|
}
|
}
|
|
/**
|
* 创建样式化按钮
|
*/
|
private JButton createStyledButton(String text, Color color) {
|
JButton button = new JButton(text);
|
button.setFont(new Font("Microsoft YaHei", Font.BOLD, 14));
|
button.setBackground(color);
|
button.setForeground(Color.WHITE);
|
button.setFocusPainted(false);
|
button.setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 20));
|
button.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
|
button.addMouseListener(new java.awt.event.MouseAdapter() {
|
public void mouseEntered(java.awt.event.MouseEvent evt) {
|
button.setBackground(brighterColor(color));
|
}
|
|
public void mouseExited(java.awt.event.MouseEvent evt) {
|
button.setBackground(color);
|
}
|
});
|
|
return button;
|
}
|
|
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);
|
}
|
|
/**
|
* 清理资源
|
*/
|
private void disposeDialog() {
|
running = false;
|
|
// 停止音频
|
if (audioClip != null) {
|
if (audioClip.isRunning()) {
|
audioClip.stop();
|
}
|
audioClip.close();
|
audioClip = null;
|
}
|
|
// 清理UI引用
|
countdownLabel = null;
|
|
dispose();
|
}
|
|
/**
|
* 显示对话框
|
*/
|
public int showDialog() {
|
setVisible(true);
|
return result;
|
}
|
}
|
|
}
|