2013-02-28 135 views
2

我試圖從JDialog得到WindowOpened事件,但它只被觸發一次。 爲什麼windowClosing正常工作並且WindowOpened只有一次?有沒有什麼辦法可以每次開啓JDialog的公開活動?JDialog WindowOpened事件只被觸發一次

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowEvent; 

public class NewClass extends JDialog { 

    public void init() { 
     setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
     setModal(true); 
     setSize(100,100); 
     setLocationRelativeTo(null); 
    } 

    public void addListener() { 
     addWindowListener(
      new java.awt.event.WindowAdapter() { 
      public void windowOpened(WindowEvent e) { 
       System.out.println("Invoking WindowOpened from JDialog"); 
      } 
      public void windowClosing(WindowEvent e) { 
       System.out.println("Invoking WindowClosing from JDialog"); 
       dispose(); 
      } 
     }); 
    } 

    public static void main(String args[]) { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(200,70); 

     final NewClass d = new NewClass(); 
     d.init(); 
     d.addListener(); 

     JButton b = new JButton("Show Dialog"); 
     b.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       d.setVisible(true); 
      } 
     }); 

     f.getContentPane().add(b); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

你試過WindowActivated了嗎? WindowOpened在首次打開時工作。每次激活窗口時,WindowActivated都可以使用。並將您的對話框更改爲JFrame,這樣您可以最​​小化您的窗口。 – 2013-02-28 16:43:26

+1

@GabrielCâmara*「並將您的對話框更改爲JFrame ..」*這不是一個好的舉措。請參閱[使用多個JFrames,好/壞實踐?](http://stackoverflow.com/a/9554657/418556) – 2013-02-28 16:45:53

+0

我同意@AndrewThompson,但他沒有說他使用多個窗口。有一個框架沒有錯......它也可能是一個主框架。 – 2013-02-28 16:49:39

回答

2
addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowActivated(WindowEvent e) { 
       // TODO Auto-generated method stub 
       super.windowActivated(e); 
      } 
     }); 
2

ComponentListener#componentShown(ComponentEvent e)只要您窗口可見被激發。

我不認爲WindowActivated是一個很好的選擇(像其他人說的),因爲它可以在其他一些情況下被解僱。例如,如果你的對話框不是模態的,當窗口重新獲得焦點時,WindowActivated將被觸發。