2012-01-25 3 views
3

대화 상자 바깥 쪽을 클릭했을 때 발생하는 이벤트를 잡는 방법 대신 깜박이는 코드가 중요하지 않습니다.

Windows에서 대화 상자 바깥을 클릭하려고하면 소리가 'ding'으로 들리고이 이벤트의 악곡을 뛰어 넘을 수 있는지 궁금합니다. 이것이 가능한가?사용자가 외부에서 클릭 할 때 모달 JDialog를 깜박이는 방법

감사합니다.

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

* "Windows에서 대화 상자 바깥을 클릭하려고하면 '땡땡 소리가납니다'"* 소리가 나지 않습니다. '딩 (ding)'은 대화 상자가 모달이고 대화 상자를 소유 한 *** 응용 프로그램의 다른 부분을 클릭하는 경우에만 발생합니다. *** –

+1

이벤트를보고 나면 무엇을하고 싶습니까? – trashgod

+0

@AndrewThompson 맞습니다. 나는 클릭이 애플리케이션 내에 있지만 대화 상자 자체에는 없다는 것을 암시했다. 해명 해줘서 고마워. – rtheunissen

답변

1

대화 모달을 확인하고 그것을 부모를 제공합니다. E.G. JDialog(Frame,String,boolean) 생성자를 사용합니다.

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

부모에게주는 것은 무엇입니까? 미안 내가 바로 그 이유/기능을 볼 수 없다면. – rtheunissen

+0

시도해보십시오. 다시보고하십시오. –

+0

차이가 없습니다. SSCCE 때가 된 것 같습니다. – rtheunissen

관련 문제