2012-03-01 4 views
4

JFrameにJDialogを表示します。このJDialogは、処分しても何も行いません。私は終了イベントをキャッチしてポップアップを表示したいが、何も起こらない。JDialogを閉じるときにWindowEventが表示されない

私はバグを見つけることができません。問題がどこにあるのか教えていただけますか?

ありがとうございます!

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

あなたはWINDOW CLOSINGイベントをキャッチするために、あなたのJDialogTestクラスにaddWindowListenerを忘れていました。このような何か:JFrameTestクラス内JDialogTestクラスのオブジェクトを作成中

addWindowListener(this); 

はまた、あなたのJDialogTestクラスとその他の時間内に一度setVisible(true)を呼んでいます。

SwingでsetXXXSize(...)メソッドを使用しないでください。レイアウトマネージャがその部分を気にしないようにしてください。さらに、setLocationRelativeTo(null)の代わりにsetLocationByPlatform(true)を使用すると賢明になります。後者の代わりに前者を使うべきであるという非常に良い例は、@Andrew Thompsonによって提供されています。How to best position Swing GUI's

+0

ありがとうございました!確かに、私はaddWindowListener(this)を忘れてしまった。それ以外は、私の問題を示すのはちょうど[SSCCE](http://sscce.org/)でした。しかし、とにかくアドバイスをいただきありがとうございます。 – Maxbester

+0

@ user902025:あなたの歓迎と笑顔:-) –

関連する問題