대화 상자 바깥 쪽을 클릭했을 때 발생하는 이벤트를 잡는 방법 대신 깜박이는 코드가 중요하지 않습니다.
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;
}
}
}
* "Windows에서 대화 상자 바깥을 클릭하려고하면 '땡땡 소리가납니다'"* 소리가 나지 않습니다. '딩 (ding)'은 대화 상자가 모달이고 대화 상자를 소유 한 *** 응용 프로그램의 다른 부분을 클릭하는 경우에만 발생합니다. *** –
이벤트를보고 나면 무엇을하고 싶습니까? – trashgod
@AndrewThompson 맞습니다. 나는 클릭이 애플리케이션 내에 있지만 대화 상자 자체에는 없다는 것을 암시했다. 해명 해줘서 고마워. – rtheunissen