2012-03-01 2 views
4

Я показываю JDialog в JFrame. Этот JDialog ничего не делает. Я хотел бы поймать событие закрытия и отобразить всплывающее окно, но ничего не происходит.Нет WindowEvent при закрытии JDialog

Я не могу найти ошибку. Не могли бы вы рассказать мне, где проблема?

Большое спасибо!

import java.awt.Dialog; 
import java.awt.FlowLayout; 
import java.awt.Window; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowListener; 

import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JTextArea; 


@SuppressWarnings("serial") 
public class JFrameTest extends JFrame { 

    public JFrameTest() { 
     setLayout(new FlowLayout()); 
     setSize(300, 300); 
     add(new JTextArea("This is a text")); 
     setDefaultCloseOperation(JFrameTest.EXIT_ON_CLOSE); 
     getContentPane().setPreferredSize(getSize()); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
     JDialogTest dialog = new JDialogTest(this, Dialog.ModalityType.APPLICATION_MODAL); 
     dialog.setVisible(true); 
    } 

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

    private class JDialogTest extends JDialog implements WindowListener { 

     public JDialogTest(Window parent, ModalityType modalityType) { 
      super(parent, modalityType); 

      setLayout(new FlowLayout()); 
      add(new JLabel("This is another text")); 
      setSize(200, 50); 

      setDefaultCloseOperation(JDialogTest.DO_NOTHING_ON_CLOSE); 
      setLocationRelativeTo(null); 
      getContentPane().setPreferredSize(getSize()); 
      pack(); 
      setVisible(true); 
     } 

     @Override 
     public void windowActivated(WindowEvent e) {} 

     @Override 
     public void windowClosed(WindowEvent e) {} 

     @Override 
     public void windowClosing(WindowEvent e) { 
      JOptionPane.showMessageDialog(this, "A popup message!"); 
     } 

     @Override 
     public void windowDeactivated(WindowEvent e) {} 

     @Override 
     public void windowDeiconified(WindowEvent e) {} 

     @Override 
     public void windowIconified(WindowEvent e) {} 

     @Override 
     public void windowOpened(WindowEvent e) {} 
    } 
} 

ответ

7

Вы забыли addWindowListener к классу JDialogTest, чтобы поймать WINDOW CLOSING событие. Что-то вроде этого:

addWindowListener(this); 

Более того, вы вызываете setVisible(true) один раз внутри вашего класса JDialogTest и другое время при создании объекта класса JDialogTest внутри класса JFrameTest.

Пожалуйста, никогда не используйте какой-либо метод setXXXSize (...) в Swing, пусть Layout Manager беспокоится об этой части. Более того, будет полезно, если вы используете setLocationByPlatform(true) вместо setLocationRelativeTo(null). Хорошим примером того, почему бывший следует использовать вместо последнего, является @Andrew Thompson, в этой теме за How to best position Swing GUI's

+0

Большое спасибо за вашу помощь! Да, действительно, я забыл addWindowListener (это); В остальном это была просто [SSCCE] (http://sscce.org/), чтобы показать вам мою проблему. Но в любом случае, спасибо за совет. – Maxbester

+0

@ user902025: Ваше приветствие и удержание улыбки :-) –