Как заставить модальный JDialog мигать, когда пользователь нажимает за его пределами - PullRequest
3 голосов
/ 25 января 2012

Мигающий код не важен, а не как поймать событие, которое запускается, когда вы щелкаете за пределами диалогового окна (если оно вообще есть).

В Windows, если вы попытаетесь щелкнуть за пределами диалогового окна, прозвучит звук 'ding', и мне было просто интересно, можно ли запрыгнуть на подножку этого события. Возможно ли это?

Спасибо.

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;
      }
   }
}

1 Ответ

1 голос
/ 25 января 2012

Сделать диалог модальным и дать ему родителя.Например, используя конструктор JDialog(Frame,String,boolean).

JDialog blockingDialog = new JDialog(mainFrame, "Blocking Dialog", true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...