张世豪
6 小时以前 a6077217e25f5804027194a5c2848e773eda1abd
src/dialog/Dingshidialog.java
ÎļþÃû´Ó src/xitongshezhi/Dingshidialog.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package xitongshezhi;
package dialog;
import java.awt.BorderLayout;
import java.awt.Color;
@@ -26,6 +26,9 @@
 */
public class Dingshidialog {
    
    // æ·»åŠ é™æ€æ ‡å¿—æ¥è·Ÿè¸ªå¼¹çª—æ˜¾ç¤ºçŠ¶æ€
    private static volatile boolean isDialogShowing = false;
    /**
     * æ˜¾ç¤ºå®šæ—¶å…³é—­å¯¹è¯æ¡†
     * @param parent çˆ¶çª—口
@@ -34,8 +37,14 @@
     * @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);
    public static int showTimedDialog(Frame parent, int countdownTime, String message) {
        // æ£€æŸ¥æ˜¯å¦å·²æœ‰å¼¹çª—在显示
        if (isDialogShowing) {
            System.out.println("已有弹窗在显示,忽略新请求");
            return 0; // è¿”回失败
        }
        TimedDialog dialog = new TimedDialog(parent, countdownTime, message);
        return dialog.showDialog();
    }
    
@@ -43,19 +52,18 @@
     * å†…部对话框类,确保使用后能被垃圾回收
     */
    @SuppressWarnings("serial")
   private static class TimedDialog extends JDialog {
    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) {
        public TimedDialog(Frame parent, int countdownTime, String message) {
            super(parent, "", true);
            this.remainingTime = countdownTime;
            initializeUI(message);
            startCountdown();
            playAudio(audioFile);
        }
        
        private void initializeUI(String message) {
@@ -89,7 +97,7 @@
            messageLabel.setHorizontalAlignment(SwingConstants.CENTER);
            // åˆ›å»ºå€’计时标签
            countdownLabel = new JLabel("剩余时间: " + remainingTime + "秒");
            countdownLabel = new JLabel(remainingTime + "秒后自动关闭");
            countdownLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 16));
            countdownLabel.setForeground(new Color(231, 76, 60));
            countdownLabel.setHorizontalAlignment(SwingConstants.CENTER);
@@ -132,6 +140,18 @@
                public void windowClosing(java.awt.event.WindowEvent e) {
                    disposeDialog();
                }
                @Override
                public void windowOpened(java.awt.event.WindowEvent e) {
                    // è®¾ç½®å¼¹çª—显示标志
                    isDialogShowing = true;
                }
                @Override
                public void windowClosed(java.awt.event.WindowEvent e) {
                    // ç¡®ä¿å¼¹çª—关闭时重置标志
                    isDialogShowing = false;
                }
            });
        }
        
@@ -147,7 +167,7 @@
                        
                        SwingUtilities.invokeLater(() -> {
                            if (countdownLabel != null) {
                                countdownLabel.setText("剩余时间: " + remainingTime + "秒");
                                countdownLabel.setText( remainingTime + "秒后自动关闭");
                            }
                        });
                        
@@ -245,6 +265,9 @@
            // æ¸…理UI引用
            countdownLabel = null;
            
            // é‡ç½®å¼¹çª—显示标志
            isDialogShowing = false;
            dispose();
        }
        
@@ -252,6 +275,12 @@
         * æ˜¾ç¤ºå¯¹è¯æ¡†
         */
        public int showDialog() {
            // å†æ¬¡æ£€æŸ¥æ ‡å¿—,防止竞态条件
            if (isDialogShowing) {
                System.out.println("已有弹窗在显示,取消显示");
                return 0;
            }
            setVisible(true);
            return result;
        }