java - 当用户在其外部单击时如何使模态 JDialog 闪烁

标签 java swing

闪烁代码并不重要,重要的是如何捕捉当您在对话框外单击时触发的事件(如果有的话)。

在 Windows 上,如果您尝试在对话框外单击,它会发出 '叮' 的声音,我只是想知道是否可以加入该事件的潮流。这可能吗?

谢谢。

SSCCE:

import com.sun.awt.AWTUtilities;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ModalDialogSSCCE {
   private JFrame frame = new JFrame("Modal Dialog SSCCE - click to display dialog");
   private JPanel dialogContent = new JPanel();
   private ModalDialog dialog;

   public static void main(String[] args) {
      new ModalDialogSSCCE();
   }

   public ModalDialogSSCCE() {
      Action closeAction = new AbstractAction() {
         public void actionPerformed(ActionEvent e) {
            dialog.setVisible(false);
         }
      };

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setPreferredSize(new Dimension(500, 500));

      JButton closeButton = new JButton("Close");
      closeButton.addActionListener(closeAction);

      dialogContent.setSize(200, 200);
      dialogContent.setBackground(Color.DARK_GRAY);
      dialogContent.add(closeButton, BorderLayout.CENTER);
      dialog = new ModalDialog(dialogContent, closeAction);

      frame.getContentPane().addMouseListener(new MouseAdapter(){
         public void mouseClicked(MouseEvent e){
            dialog.setVisible(true);
         }
      });

      frame.pack();
      frame.setVisible(true);
      frame.setLocationRelativeTo(null);
   }

   public class ModalDialog extends JDialog {

      private JComponent content;
      private final int shadowSize = 5;

      public ModalDialog(JComponent content, Action closeAction) {    
         this.setLayout(null);
         this.content = content;
         this.setUndecorated(true);
         AWTUtilities.setWindowOpaque(this, false);
         this.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);  
         this.getContentPane().add(content);

         content.setBounds(shadowSize, shadowSize, content.getWidth(), content.getHeight());
         content.getInputMap(JComponent.WHEN_FOCUSED)
                .put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "close");
         content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "close");
         content.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
                .put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "close");
         content.getActionMap().put("close", closeAction);
      }

      @Override
      public void paint(Graphics graphics) {
         super.paint(graphics);
         Graphics2D g = (Graphics2D) graphics.create();
         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
         g.setColor(new Color(50, 50, 50, 50));
         g.setStroke(new BasicStroke(shadowSize));
         g.drawRoundRect(shadowSize / 2 + 1, shadowSize / 2 + 1, getWidth() - shadowSize - 2, getHeight() - shadowSize - 2, 1, 1);
         content.repaint();
      }

      public void toggle() {
         if (isVisible()) this.setVisible(false);
         else this.setVisible(true);
      }

      @Override
      public void setVisible(boolean visible) {
         if (visible) {
            this.setBounds(frame.getX() + (frame.getWidth() - content.getWidth()) / 2,
            frame.getY() + (frame.getHeight() - content.getHeight()) / 2,
                           content.getWidth() + 2 * shadowSize,
                           content.getHeight() + 2 * shadowSize);
         }
         super.setVisible(visible);
      }

      public JComponent getContent() {
         return content;
      }
   }
}

最佳答案

使对话框成为模态对话框并给它一个父项。例如。使用 JDialog(Frame,String,boolean)构造函数。

JDialog blockingDialog = new JDialog(mainFrame, "Blocking Dialog", true);

关于java - 当用户在其外部单击时如何使模态 JDialog 闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8998248/

相关文章:

java - JTable inside JLayeredPane inside JScrollPane - 你如何让它工作?

java - 如何根据集合值的大小对 map 进行排序?

java - 从java程序在后台启动shell脚本

java - 显示剪切位置

java - 在运行时更改 Autowiring 对象

java - 直到鼠标悬停或最小化窗口后,JComponent 才会出现,并且 JTextField 问题

java - 运行 Java 一段特定的时间

java - 我们如何调整 JTabbedPane 按钮的大小?

java - 无法从 GUI 正确检索 Unicode 数据

java - NetBeans 无法识别我的程序中的 setPromptText 代码