2011-12-21 38 views
1

我有2幀:孩子。我想要執行以下操作: 當父框架被激活或取消消息時,子框架執行相同的操作。Java swing:從另一幀中收聽和重複的事件

private void attachListeners() 
    { 
     if (parentFrame != null) 
     { 
      parentFrame.addComponentListener(this); 
      parentFrame.addWindowListener(new ViewEventAdapter(this)); 
     } 
    @Override 
     public void viewActivated() 
     {    
      // show it when the parent is activated 
      if (!childFrame.isVisible()) 
      { 
         childFrame.setVisible(true); 
         parentFrame.toFront(); 
      } 
     } 

但是這會導致無限循環的閃爍。如果我刪除toFront(),我不能將焦點切換到父框架。我只需要以某種方式正確地切換焦點。

監聽器代碼:

public class ViewEventAdapter implements WindowListener, InternalFrameListener 
{ 
    private MyViewListener listener = null; 


    public ViewEventAdapter(MiaViewListener inListener) 
    { 
     listener = inListener; 
    } 


    @Override 
    public void windowActivated(WindowEvent inE) 
    { 
     listener.viewActivated(); 
    } 


    @Override 
    public void windowClosed(WindowEvent inE) 
    { 
     listener.viewClosed(); 
    } 


    @Override 
    public void windowClosing(WindowEvent inE) 
    { 
     listener.viewClosing(); 
    } 


    @Override 
    public void windowDeactivated(WindowEvent inE) 
    { 
     listener.viewDeactivated(); 
    } 


    @Override 
    public void windowDeiconified(WindowEvent inE) 
    { 
     listener.viewDeiconified(); 
    } 


    @Override 
    public void windowIconified(WindowEvent inE) 
    { 
     listener.viewIconified(); 
    } 


    @Override 
    public void windowOpened(WindowEvent inE) 
    { 
     listener.viewOpened(); 
    } 


    @Override 
    public void internalFrameActivated(InternalFrameEvent inE) 
    { 
     listener.viewActivated(); 
    } 


    @Override 
    public void internalFrameClosed(InternalFrameEvent inE) 
    { 
     listener.viewClosed(); 
    } 


    @Override 
    public void internalFrameClosing(InternalFrameEvent inE) 
    { 
     listener.viewClosing(); 
    } 


    @Override 
    public void internalFrameDeactivated(InternalFrameEvent inE) 
    { 
     listener.viewDeactivated(); 
    } 


    @Override 
    public void internalFrameDeiconified(InternalFrameEvent inE) 
    { 
     listener.viewDeiconified(); 
    } 


    @Override 
    public void internalFrameIconified(InternalFrameEvent inE) 
    { 
     listener.viewIconified(); 
    } 


    @Override 
    public void internalFrameOpened(InternalFrameEvent inE) 
    { 
     listener.viewOpened(); 
    } 
} 

public interface MyViewListener 
{ 
    /** 
    * Called when a view is activated 
    */ 
    public void viewActivated(); 

    /** 
    * Called when a view is closed 
    */ 
    public void viewClosed(); 

    /** 
    * Called when a view is closing 
    */ 
    public void viewClosing(); 

    /** 
    * Called when a view is deactivated 
    */ 
    public void viewDeactivated(); 

    /** 
    * Called when a view is deiconified 
    */ 
    public void viewDeiconified(); 

    /** 
    * Called when a view is iconified 
    */ 
    public void viewIconified(); 

    /** 
    * Called when a view is opened 
    */ 
    public void viewOpened(); 
} 

請幫助。提前致謝。

+1

這段代碼甚至沒有編譯:)你可以發佈'ViewEventAdapter'代碼嗎? – GETah 2011-12-21 19:47:17

+0

爲ViewEventAdapter添加代碼 – bunnyjesse112 2011-12-22 07:42:55

回答

2

請勿使用2個JFrame。

相反,父級應該是JFrame,孩子應該是非模態的JDialog。在創建對話框時,您將框架指定爲父級,並且默認情況下會獲得此行爲。

這是大多數應用程序設計的方式。

+0

感謝您的回覆。我需要2個Jframes。有沒有辦法指定框架的父框架? – bunnyjesse112 2011-12-22 07:07:07

+1

爲什麼你認爲你需要2個JFrames?如果您創建單獨的框架,那麼這些框架應該相互獨立地進行操作。如果你想讓窗口一起作用,那麼標準設計就是使用一個JFrame和一個或多個子JDialog。您可以像JFrame一樣將任何組件添加到JDialog。當您一起使用JFrame/JDialog時,任務欄上只顯示一個圖標,以便它們一起打開/關閉。使用兩個Jframe時,您會在任務欄上看到2個圖標,您需要單獨打開/關閉它們。沒有辦法指定父項,因爲它不是標準設計。 – camickr 2011-12-22 15:48:20

+0

所以沒有辦法讓2幀一起反應。恥辱... – bunnyjesse112 2011-12-22 16:03:49