我有 2 个框架:父 和 子。我想做以下事情: 当父框架被激活或取消图标时,子框架会执行相同的操作。
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();
}
请帮忙。提前致谢。
最佳答案
不要使用 2 个 JFrame。
相反,父级应该是 JFrame,子级应该是非模式 JDialog。当您创建对话框时,您将框架指定为父框架,并且默认情况下您会获得此行为。
这是大多数应用程序的设计方式。
关于Java Swing : Listening and repeating events from one frame in another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594517/