2011-12-21 15 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